Nginx重写功能和反向代理

目录

一、重写功能rewrite

1. ngx_http_rewrite_module模块指令

1.1 if 指令

 1.2 return 指令

1.3 set 指令

1.4 break 指令

2. rewrite 指令

3. 防盗链

3.1 实现盗链

3.2 实现防盗链 

4. 实用网址

 二、反向代理

1. 概述

2. 相关概念

3. 反向代理模块

4. 参数配置

5. 示例

5.1 反向代理单台web服务器,实现单台反向代理。

5.2 指定location实现反向代理动静分离


一、重写功能rewrite

1. ngx_http_rewrite_module模块指令

1.1 if 指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) {   action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

示例:

① 修改子配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;root /data/;location / {if ( $scheme = http ) {      #如果请求协议是httpecho "if------->$scheme";    #则打印协议}}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload

② 访问页面

[root@localhost ~]# curl 192.168.190.102
if------->http

 1.2 return 指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置。

语法格式:

www.pc.com/test/
404
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址

示例:

① 修改子配置文件

[root@localhost conf.d]# vim pc.conf
server {listen 80;root /data/;location / {if (!-e $request_filename) {   #如果访问的页面不存在return 302  /index.html;       #返回302,跳转至主页面}}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload

② 访问不存在页面,查看是否可以跳转

[root@localhost ~]# curl 192.168.190.102/x
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@localhost ~]# curl 192.168.190.102/x -L
welcome
#-vL选项可以查看详情信息

③ 当然也可以跳转至百度

return 302  http://www.baidu.com;

http状态码301和302区别?

301:永久重定向,读取过一次就会将此条配置缓存在我们的客户端,即使nginx服务器宕机,在缓存时间内还是可以跳转

302:临时重定向,不会有缓存在客户端,每次跳转需要nginx服务器解析,一旦服务器宕机就无法跳转

302状态码宕机服务器查看详情:

 301状态码宕机服务器查看详情:

server {listen 80;root /data/;location /test {default_type text/plain;return 301 /index.html;}
}

1.3 set 指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。  

语法格式:

Syntax: set $variable value;
Default: —
Context: server, location, if

示例:

① 修改配置文件

  server {listen 80;location / {set $name yun;echo $name;set $my_port $server_port;    #将内置变量定义给自定义变量echo $my_port;}
}

 ② 访问页面

[root@localhost ~]# curl 192.168.190.102
yun
80

1.4 break 指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用。

注意:如果break指令在location块中后续指令还会继续执行只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行。

2. rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理。

rewrite可以配置在 server、location、if。语法格式:

rewrite可以配置在 server、location、if
语法格式 :
rewrite regex               replacement(www.baidu.com)        [flag];正则匹配原始访问url    替代的url链接                        标志  ()premanent301   redirect302  break  last

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向301。

正则表达式格式:

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字    [0-9]   
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W  #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 这几个字母以外的任意字符

示例:

访问 bj 跳转到 beijing 

① 修改配置文件

server {listen 80;server_name www.pc.com;root /data/;location /bj {rewrite ^/bj/(.*) /beijing/$1 permanent;}
}

② 新建对应文件夹及页面文件

[root@localhost ~]# mkdir /data/beijing
[root@localhost ~]# echo beijing nihao > /data/beijing/index.html

 ③ 访问页面bj

[root@localhost ~]# curl 192.168.190.102/bj/ -L
beijing nihao                     #可以跳转

整个网站重写:

① 配置文件

server {listen 80;server_name www.pc.com;root /data/;location / {rewrite / http://www.baidu.com permanent;  #如果访问根就跳转到百度}
}

 ② 访问根查看是否跳转百度

 实战案例:http转https

① 配置文件

server {listen 80;listen 443 ssl;root /data/;ssl_certificate /data/ssl/www.kgc.com.crt;ssl_certificate_key /data/ssl/www.kgc.com.key;ssl_session_cache shared:sslcache:20m;ssl_session_timeout 10m;location / {if ( $scheme = http ) {                    #如果请求协议是httprewrite /(.*) https://$host/$1 permanent;  #重写成https}}
}

② 访问页面

 last 与 break:

location /break {           #访问break
rewrite .* /test break;     #重写到test
}location /last {            #访问break 
rewrite .* /test last;      #重写到test
}location /test {
rewrite 403;                #last返回403,因为last会多次匹配
}

说明: 

  • redirect;302:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
  • permanent;301:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
  • break:重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用,适用于一个URL一次重写 
  • last:重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用。适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301

其他示例:

案例1:更换目录访问方式,目录转化为对象存储形式

要求:

/20200106/static->/static?id=20200106

/20200123/image ->/image?id=20200123

方法:

rewrite  ^/(\d+)/(.+)/   /$2?id=$1  break;

\d+:一个以上数字;.+:一个以上的字符

案例2:多目录转换访问方式

要求:

www.lucky.com/images/20200106/1.jpg => www.lucky.com/index.do?name=images&dir=20200106=&fi1e=1.jpg 

规则配置:

if($host ~*  (.*)\.lucky\.com) {
rewrite  ^/(.*)/(\d+)/(.*)$   /index.do?name=$1&dir=$2&file=$3 last;

}

3. 防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种:

  • none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
  • blocked:#请求报文有referer首部,但无有效值,比如为空。
  • server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
  • arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.kgc.org www.kgc.*
  • regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.kgc\.com

3.1 实现盗链

① 被盗端添加文件a.jpg

[root@localhost data]# ls
a.jpg  beijing  favicon.ico  index.html  ssl

② 盗取端开启httpd服务,添加web前端配置

[root@localhost ~]# cd /var/www/html/
<html>
<body>
<h1>ni hao  </h1>
<img src="http://192.168.190.102/a.jpg"/>  #这里如果写域名,需要修改hosts配置添加域名解析
</body>
</html>
[root@localhost html]# systemctl restart httpd

 ③ 访问盗取端地址,可以直接获得被盗端图片

3.2 实现防盗链 

① 配置文件

server{listen 80;server_name www.pc.com;root /data;location ~* \.(jpg|gif|swf)$ {root  /data/nginx/pc;valid_referers none blocked *.pc.com pc.com;    if ( $invalid_referer ) {rewrite ^/ http://www.pc.com/error.png;}}
}

② 再次访问盗取端地址

③ 无法盗取图片,状态码403 

4. 实用网址

https://www.digitalocean.com/community/tools/nginx
#自动生成nginx配置文件
https://github.com/agile6v/awesome-nginx/
#第三方模块
https://www.runoob.com/lua/lua-tutorial.html
#lua帮助
https://666666.dev/#/
#it人工具箱

 二、反向代理

1. 概述

Nginx 反向代理是一种网络通信方式,它允许 Nginx 服务器代表客户端向其他服务器发送请求,并将收到的响应返回给客户端。这种代理方式隐藏了真实的服务器信息,提供了负载均衡、安全性和性能优化等好处。

2. 相关概念

正向反向代理区别:

  • 正向代理:代理客户端去访问服务器
  • 反向代理:代理的是服务器

同构代理和异构代理: 

  • 同构代理:客户到至代理端和代理端至服务端使用请求协议一致
  • 异构代理:客户到至代理端和代理端至服务端使用请求协议不一致

3. 反向代理模块

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

4. 参数配置

proxy_pass; 
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
地址:端口的方式
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持

5. 示例

5.1 反向代理单台web服务器,实现单台反向代理。

客户端:192.168.190.101,服务器:192.168.190.100;代理服务器:192.168.190.102

① 代理服务器配置文件

server{listen 80;server_name www.pc.com;root /data;location / {proxy_pass http://192.168.190.100;  #访问本机的根等于访问指定地址}       
}

② 客户端开启httpd服务

[root@localhost html]# cat index.html 
<html>
<body>
<h1>ni hao  </h1>
</body>
</html>

③ 客户端访问代理服务器

[root@localhost ~]# curl 192.168.190.102
<html>
<body>
<h1>ni hao  </h1>
</body>
</html>

在真实服务器上做防火墙规则:

丢弃:

① 服务端添加防火墙规则

iptables -A INPUT  -s 192.168.190.102 -j DROP
#客户端再次访问会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间

② 客户端访问代理服务器

[root@localhost ~]# curl 192.168.190.102 -I
HTTP/1.1 504 Gateway Time-out
Server: nginx/1.18.0
Date: Mon, 26 Feb 2024 10:50:47 GMT
Content-Type: text/html
Content-Length: 167
Connection: keep-alive
#提示504超时

拒绝:

① 服务器修改防火墙规则

[root@localhost html]# iptables -R INPUT 1  -s 192.168.190.102 -j REJECT
#客户端再次访问,会出现502,一般出现502代表后端真实服务器挂了

 ② 客户端访问代理服务器

[root@localhost ~]# curl 192.168.190.102 -I
HTTP/1.1 502 Bad Gateway
Server: nginx/1.18.0
Date: Mon, 26 Feb 2024 10:55:15 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive

针对某个uri 进行访问:

要求:将用户对域www.pc.com的请求转发给后端服务器处理

 ① 代理端配置文件

server{listen 80;server_name www.pc.com;root /data;location ~* /api {                   #只要包含api的都替换成192.168.190.100proxy_pass http://192.168.190.100;}
}http://192.168.91.101  不加/ 是将location上的url追加在后面
http://192.168.91.101/ 加上/ 是将1ocation上的url替换后proxy配置里的连接

5.2 指定location实现反向代理动静分离

环境:动态服务器7-0:192.168.190.100;静态服务器7-1:192.168.190.101;代理服务器:192.168.190.102;客户端:192.168.190.103

① 两台服务器分别开启httpd服务,新建对应web文件

192.168.190.100 7-0:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# mkdir api
[root@localhost html]# echo dongtai 7-0 > api/index.html192.1681.190.101 7-1:
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo jingtai 7-1 > index.html
[root@localhost html]# ls
a.jpg  index.html

② 代理服务器配置文件

server {listen 80;server_name www.pc.com;root /data;location ~* /api {proxy_pass http://192.168.190.100;  
#访问代理的api的url就跳转到http://192.168.190.100/api/index.html     }location ~* \.(jpg|jpeg|png|gif|bmp)$ {proxy_pass http://192.168.190.101;
#访问以这些结尾的文件,代理地址/a.jpg,那么就去http://192.168.190.101/a.jpg}
}

访问192.168.190.102/a.jpg等于访问192.168.190.101/a.jpg:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代&#xff0c;移动设备已经成为我们生活和工作的必备工具。然而&#xff0c;在一些特殊的场合中&#xff0c;普通的平板电脑可能无法满足需求&#xff0c;比如工厂车间、野外作业、极端天气等环境下。此时&#xff0c;三防平板就成了不二之选。那么&…

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台&#xff0c;通过其轻量级的容器技术&#xff0c;使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程&#xff0c;并详细解析其基本概念、组件及常用命令&#xff0c;以帮助读者充分理解和熟练使用 Docker。企业…

mac安装zookeeper

下载地址&#xff1a; http://archive.apache.org/dist/zookeeper/ 注意&#xff1a;由于Zookeeper从3.5.5版本开始&#xff0c;带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包&#xff0c;而之前的普通的tar.gz的包里面是只是源码的包无法直接使…

Laravel04 eloquent

eloquent 1. eloquent2. 创建eloquent model 以及 取数据 1. eloquent 文档地址&#xff1a; https://learnku.com/docs/laravel/8.x/eloquent/9406 下面是我们&#xff0c;通过laravel的DB类从数据库中获取了post记录&#xff0c;那么有没有可能我们直接获取一个post对象&am…

Ps:索引颜色模式

Ps菜单&#xff1a;图像/模式/索引颜色 Image/Mode/Indexed Color 索引颜色 Indexed Color模式可生成最多 256 种颜色的 8 位图像文件。 这种颜色的限制使得索引颜色模式的图像文件相比于全彩图像&#xff08;如 RGB 颜色模式下的图像&#xff09;具有更小的文件大小&#xff0…

使用mumu模拟器开启调试安卓pwa程序环境,配置谷歌环境,并增加pwa安卓/苹果/PC电脑安装流程

环境配置 当你想开发pwa程序时&#xff0c;手上没有安卓手机怎么办&#xff1f;使用mumu安卓模拟器也是可以的&#xff0c;使用安卓模拟器后&#xff0c;可能自带的浏览器不支持pwa&#xff0c;还需要安装chrom浏览器&#xff0c;当你安装好chrom浏览器后&#xff0c;打开又提…

利用项目管理软件规划的成功之路

项目开发对于任何类型的项目都是一个有用的过程。软件开发项目、建筑项目、运输项目和变更管理项目都可以从这种方法提供的结构、指导和策略中获益。 项目开发涉及规划项目时间表、投资资源以及安排团队成员的时间。与项目管理一样&#xff0c;项目开发贯穿项目始终&#xff0…

用 React 实现搜索 GitHub 用户功能

用 React 实现搜索 GitHub 用户功能 在本篇博客中&#xff0c;我们将介绍如何在 React 应用中搜索 GitHub 用户并显示他们的信息。 创建 React 应用 首先&#xff0c;我们使用 Create React App 创建一个新的 React 应用。Create React App 是一个快速搭建 React 项目的工具…

MATLAB练习题:并行计算的parfor循环

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB中&#xff0c;parfor&#xff08;Parallel for&…

30-k8s集群的七层代理-ingress资源(进阶知识)

一、ingress概述 1&#xff0c;引发问题 目前使用svc资源做网络暴露&#xff0c;使用nodeport类型&#xff0c;一个业务对应一个宿主机端口&#xff0c;那么如果业务多了&#xff0c;所占用的宿主机端口也就多了&#xff0c;虽然说宿主机端口一般情况下都是够用的&#xff0c;…

python自动化管理和zabbix监控网络设备(有线网络和路由配置部分)

目录 目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 六、FW1 七、DMZ-SW1 结语 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name…

【Java设计模式】一、工厂模式、建造者模式、原型设计模式

文章目录 1、简单工厂模式2、工厂方法模式3、抽象工厂模式4、建造者模式5、原型设计模式 设计模式即总结出来的一些最佳实现。23种设计模式可分为三大类&#xff1a; 创建型模式&#xff1a;隐藏了创建对象的过程&#xff0c;通过逻辑方法进行创建对象&#xff0c;而不是直接n…

贝叶斯核机器回归拓展R包:bkmrhat

1.摘要 bkmrhat包是用于扩展bkmr包的贝叶斯核机器回归&#xff08;Bayesian Kernel Machine Regression, BKMR&#xff09;分析工具&#xff0c;支持多链推断和诊断。该包利用future, rstan, 和coda包的功能&#xff0c;提供了在贝叶斯半参数广义线性模型下进行identity链接和 …

CUDA编程 - 用向量化访存优化 - Cuda elementwise - Add(逐点相加)- 学习记录

Cuda elementwise - Add 一、简介1.1、ElementWise Add1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.1、简单的逐点相加核函数2.2、ElementWise Add float4&#xff08;向量化访存&#xff09;2.3、完整代码 一、简介 1.1、ElementWise Add Element-wise 操作…

替代 Intercom 和 Zendesk: 开源的客户互动套件 | 开源日报 No.183

chatwoot/chatwoot Stars: 17.8k License: NOASSERTION chatwoot 是一个开源的客户互动套件&#xff0c;是 Intercom、Zendesk、Salesforce Service Cloud 等的替代品。 该项目主要功能、关键特性和核心优势包括&#xff1a; 支持多种对话渠道&#xff0c;如网站、Facebook、…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年&#xff0c;由Boyce和Chamberlin提出 1975~1979&#xff0c;IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

【 C++ 】闭散列哈希表的模拟实现

哈希节点状态 我们都很清楚数组里的每一个值无非三种状态&#xff1a; 如果某下标没有值&#xff0c;则代表空EMPTY。如果有值在代表存在EXIST。如果此位置的值被删掉了&#xff0c;则表示为DELETE。 而这三种状态我们可以借助enum枚举来帮助我们表示数组里每个位置的状态。…

亿道推出重磅加固平板!为行业发展注入新动力

随着科技生产力的不断发展&#xff0c;各行各业都得到质的飞跃。产品的迭代速度也大大加快&#xff0c;作为全球领先的加固行移动终端一站式提供商&#xff0c;亿道信息跟紧时代潮流&#xff0c;推出EM-I10J、EM-I20J两款均衡型加固平板&#xff0c;为行业发展注入新动力。 接地…

【Python笔记-设计模式】命令模式

一、说明 命令模式是一种行为设计模式&#xff0c;旨在对命令的封装&#xff0c;根据不同的请求将方法参数化、延迟请求执行或将其放入队列中&#xff0c;且能实现可撤销操作。 (一) 解决问题 将请求发送者和接受者解耦&#xff0c;请求发送者只需知道如何发送请求&#xff…

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL&#xff0c;前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板&#xff0c;虽然有RT-Thread 集成好的LVGL 环境&#xff0c;只需要几个步骤就能成功把lvgl 的示例运行起来&#xff0c;对于爱折腾的我来说&#xff0c;过于简单也并…