Nginx 核心功能02
目录
一、引言
二、正向代理
(一)正向代理基础概念
(二)Nginx 正向代理安装配置
(三)正向代理配置与验证
三、反向代理
(一)反向代理原理与应用场景
(二)配置 Nginx 七层代理
(三)配置 Nginx 四层代理
四、Nginx 缓存
(一)缓存功能的核心原理和缓存类型
(二)代理缓存功能设置
五、Nginx rewrite 和正则
(一)Nginx 正则
(二)nginx location
(三)Rewrite
一、引言
Nginx 是一款在现代 Web 架构中占据重要地位的高性能开源软件,它集 Web 服务器、反向代理、负载均衡等多种功能于一身。其强大的功能和出色的性能,使得它在各类 Web 应用场景中广泛应用,从大型网站的流量处理到微服务架构中的服务代理,Nginx 都发挥着关键作用。本笔记将深入探讨 Nginx 的四大核心功能:正向代理、反向代理、缓存以及 rewrite 和正则表达式的应用,通过理论与实践相结合的方式,帮助读者全面掌握 Nginx 的核心技术要点。
二、正向代理
(一)正向代理基础概念
正向代理是客户端与目标服务器之间的中间服务器。它的主要作用是代表客户端向目标服务器发起请求,并将目标服务器的响应返回给客户端。在实际应用中,正向代理常用于企业内网访问控制、匿名访问以及资源缓存加速等场景。例如,企业可以利用正向代理限制员工访问特定的网站,如社交媒体,以提高工作效率和保障网络安全;用户可以通过正向代理隐藏自己的真实 IP 地址,实现匿名访问互联网;同时,正向代理还可以缓存公共资源,如软件包、镜像文件等,减少外网带宽的消耗,加快资源的访问速度。
(二)Nginx 正向代理安装配置
- 安装支持软件:Nginx 的编译和运行依赖于一些软件包,如 pcre、zlib 等。在安装 Nginx 之前,需要先安装这些软件的开发包(devel),以提供相应的库和头文件。在 CentOS 系统中,可以使用以下命令进行安装:
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
这些软件包分别为 Nginx 提供了不同的功能支持,gcc 和 make 用于编译 Nginx 源代码,pcre-devel 提供正则表达式支持,zlib-devel 用于数据压缩,openssl-devel 用于支持 HTTPS,perl-ExtUtils-MakeMaker 用于构建和安装 Perl 扩展,git 用于获取第三方模块,wget 用于下载文件,tar 用于解压文件。
- 创建运行用户、组和日志目录:为了提高安全性和便于管理,建议为 Nginx 创建专门的用户和组。创建一个名为 nginx 的用户,不创建宿主文件夹,并且禁止该用户登录到 Shell 环境。同时,创建 Nginx 的日志目录,并设置相应的权限:
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx
这样,Nginx 服务将以 nginx 用户和组的身份运行,降低了安全风险,并且所有的日志文件都将由 nginx 用户和组进行管理。
- 编译安装 Nginx:下载 Nginx 的源代码包(如 nginx-1.26.3_http_proxy.tar.gz)并解压,然后进入解压后的目录进行配置。在配置过程中,需要指定安装目录、运行用户和组、启用的模块等。由于默认的 Nginx 不支持转发 https 请求,因此需要添加第三方模块(如 ngx_http_proxy_connect_module)来实现该功能。具体的命令如下:
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_module
[root@localhost nginx-1.26.3]# make && make install
在上述配置中,各个参数的含义如下:
--prefix=/usr/local/nginx
:指定 Nginx 的安装目录为 /usr/local/nginx。--user=nginx
和--group=nginx
:指定 Nginx 的运行用户和组为 nginx。--with-http_ssl_module
:启用对 HTTPS 的支持。--with-http_v2_module
:支持 HTTP/2 协议。--with-http_realip_module
:用于获取客户端的真实 IP 地址。--with-http_stub_status_module
:可以查看 Nginx 的连接状态等统计信息。--with-http_gzip_static_module
:启用对静态文件的 gzip 压缩功能,提高传输效率。--with-pcre
:支持正则表达式,这在 Nginx 的配置中非常重要,例如在 rewrite 规则中经常会用到。--with-stream
:支持 TCP 和 UDP 反向代理。--with-stream_ssl_module
:为 TCP 反向代理提供 SSL 加密支持。--with-stream_realip_module
:在 TCP 反向代理中获取客户端的真实 IP 地址。--add-module=./ngx_http_proxy_connect_module
:添加第三方模块,以支持 https 请求的转发。
安装完成后,为了方便使用,可以为 Nginx 的主程序创建一个链接文件,这样就可以在任意目录下直接执行 nginx 命令:
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 添加 Nginx 系统服务:为了便于管理 Nginx 服务的启动、停止、重启等操作,可以将 Nginx 添加为系统服务。在 CentOS 系统中,可以通过编写 systemd 服务脚本来实现。创建一个名为 nginx.service 的文件,内容如下:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root[Install]
WantedBy=multi-user.target
上述配置中,[Unit]
部分用于描述服务的基本信息,After=network.target
表示 Nginx 服务在网络服务启动之后启动;[Service]
部分定义了服务的启动、停止、重启等操作的命令,ExecStartPre=/usr/local/sbin/nginx -t
用于在启动前检查 Nginx 配置文件的语法正确性,ExecStart=/usr/local/sbin/nginx
用于启动 Nginx 服务,ExecReload=/usr/local/sbin/nginx -s reload
用于重新加载配置文件,ExecStop=/bin/kill -s QUIT $MAINPID
用于停止 Nginx 服务;[Install]
部分定义了服务的安装信息,WantedBy=multi-user.target
表示该服务在多用户模式下被启用。
保存文件后,重新加载 systemd 服务配置,启动 Nginx 服务,并设置为开机自启:
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
(三)正向代理配置与验证
- 配置正向代理:编辑 Nginx 的主配置文件(/usr/local/nginx/conf/nginx.conf),添加正向代理的相关配置。在配置中,需要指定代理监听的端口、解析域名的 DNS 服务器、启用代理 CONNECT 方法(以支持 HTTPS)、设置连接超时时间等。同时,在 location 块中配置代理转发规则:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
在文件中添加或修改以下内容:
server {listen 8080; # 代理监听端口server_name proxy.example.com;resolver 8.8.8.8 1.1.1.1; # 解析域名使用的DNS服务器,多个DNS用空格分隔proxy_connect; # 启用代理CONNECT方法,支持HTTPSproxy_connect_allow 443 80; # 允许代理到80和443端口proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;location / {proxy_pass $scheme://$http_host$request_uri; # 动态协议转发proxy_set_header Host $http_host;proxy_buffers 256 4k; # 优化缓冲区proxy_max_temp_file_size 0;proxy_http_version 1.1;proxy_set_header Connection "";}
}
在上述配置中,listen
指定了代理监听的端口为 8080;server_name
指定了代理服务器的域名;resolver
指定了用于解析域名的 DNS 服务器;proxy_connect
启用了代理 CONNECT 方法,使得代理服务器可以支持 HTTPS 请求;proxy_connect_allow
允许代理到 80 和 443 端口;proxy_connect_connect_timeout
、proxy_connect_read_timeout
和proxy_connect_send_timeout
分别设置了连接、读取和发送数据的超时时间;在location /
块中,proxy_pass
指定了代理转发的目标地址,使用$scheme://$http_host$request_uri
实现了动态协议转发,proxy_set_header
用于设置请求头信息,proxy_buffers
和proxy_max_temp_file_size
用于优化缓冲区设置,proxy_http_version
指定了使用的 HTTP 版本,proxy_set_header Connection ""
用于保持连接。
保存配置文件后,检查配置文件的语法正确性,并重新加载 Nginx 配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 验证正向代理:在 Windows 系统中,可以使用火狐浏览器进行验证。打开火狐浏览器的设置,找到网络代理选项,设置 http 和 https 代理为 Nginx 正向代理服务器的 IP 和端口(如 192.168.10.101:8080)。在 Linux 系统中,可以使用 curl 命令进行验证,指定代理服务器进行访问测试:
[root@localhost ~]# curl -x http://192.168.10.101:8080 www.baidu.com
通过查看 Nginx 的访问日志(位于 /var/log/nginx 目录下),可以确认正向代理功能是否正常。如果日志中记录了通过代理服务器的访问请求,并且隐藏了真实 IP 地址,说明正向代理配置成功。
三、反向代理
(一)反向代理原理与应用场景
Nginx 的反向代理分为七层(应用层)反向代理和四层(网络层)反向代理。七层反向代理基于 HTTP/HTTPS 协议,能够深入解析应用层的内容,如 URL、Header、Cookie 等,并根据这些信息将客户端的请求精准地转发至后端服务器。它在负载均衡、动静分离、SSL 终端、灰度发布等场景中发挥着重要作用。例如,在负载均衡场景中,七层反向代理可以将流量均匀地分发到多台后端服务器上,避免单点故障,提高系统的可用性;在动静分离场景中,静态资源(如图片、CSS、JS 文件)可以由 Nginx 直接响应,而动态请求(如 PHP、API 请求)则转发至后端的 Apache 或 Tomcat 服务器,提高资源的访问效率;在 SSL 终端场景中,Nginx 可以统一处理 HTTPS 加密和解密,降低后端服务器的计算压力;在灰度发布场景中,根据请求的特征(如 IP 地址、Header 信息等),可以将部分流量导向新版本的服务,实现服务的平滑升级。
四层反向代理基于 TCP/UDP 协议,直接转发原始数据流,不解析应用层内容。它适用于对性能和延迟要求较高的传输层场景,如数据库代理、游戏服务器、SSH 跳板机、高可用服务等。例如,在数据库代理场景中,四层反向代理可以对外暴露统一的端口,内部将请求转发至 MySQL、Redis 集群,实现对数据库的统一访问;在游戏服务器场景中,代理 UDP 协议,实现实时数据包的负载均衡,保障游戏的流畅运行;在 SSH 跳板机场景中,通过端口映射实现安全访问内网服务器;在高可用服务场景中,实现 TCP 服务(如 MQTT)的主备切换与健康检查,确保服务的高可用性。
(二)配置 Nginx 七层代理
- 环境准备:在后端服务器(如 192.168.10.102)上,关闭防火墙,安装 httpd 服务,并创建一个测试页面:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo "这是后端主机" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
上述命令分别停止了防火墙,安装了 httpd 服务,创建了一个简单的测试页面,并启动了 httpd 服务。
- 配置七层代理转发:在 Nginx 服务器(如 192.168.10.101)上,编辑 Nginx 的配置文件,定义后端应用服务器的地址池,并配置请求转发规则。打开 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下内容:
http {upstream backend {server 192.168.10.102:80; # 后端主机设置}server {listen 80;server_name example.com;location / {proxy_pass http://backend; # 请求转发proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
在上述配置中,upstream backend
定义了后端应用服务器的地址池,server 192.168.10.102:80
指定了后端服务器的 IP 地址和端口;在server
块中,listen 80
指定了 Nginx 监听的端口,server_name example.com
指定了域名;在location /
块中,proxy_pass http://backend
将请求转发至后端地址池,proxy_set_header Host $host
将请求中的 Host 头部设置为客户端请求的主机名,proxy_set_header X-Real-IP $remote_addr
将请求中的 X - Real - IP 头部设置为客户端的真实 IP 地址。
保存配置文件后,检查配置文件的语法正确性,并重新加载 Nginx 配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 验证转发效果:在 Nginx 服务器上,使用 curl 命令访问 Nginx 的 IP 地址,验证请求是否成功转发至后端 httpd 服务:
[root@localhost ~]# curl 192.168.10.101
如果返回 “这是后端主机”,说明七层代理转发配置成功。后端地址池中还可以定义多台主机,实现负载均衡,相关内容将在后续进一步学习。
(三)配置 Nginx 四层代理
- 配置四层代理:以代理 SSH 请求至后端服务器为例,在 Nginx 服务器(如 192.168.10.101)上编辑 Nginx 配置文件。打开 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf),添加或修改以下内容:
stream {upstream ssh_cluster {server 192.168.10.102:22; # 后端地址和服务端口}server {listen 2222;proxy_pass ssh_cluster;proxy_connect_timeout 5s; # 连接超时时间proxy_timeout 1h; # 长连接保持时间}
}
在上述配置中,stream
模块用于配置四层代理,upstream ssh_cluster
定义了后端地址池,server 192.168.10.102:22
指定了后端 SSH 服务器的 IP 地址和端口;在server
块中,listen 2222
指定了 Nginx 监听的端口,proxy_pass ssh_cluster
将请求转发至后端地址池,proxy_connect_timeout 5s
设置了连接超时时间,proxy_timeout 1h
设置了长连接保持时间。
需要注意的是,stream
模块需要与http
模块平级,不能在http
模块中嵌套。保存配置文件后,检查配置文件的语法正确性,并重新加载 Nginx 配置,同时检查端口监听情况:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ss -nlpt | grep 2222
- 验证四层代理:在本地使用 ssh 命令连接 Nginx 服务器的代理端口(如 2222),验证是否能成功登录到后端服务器:
[root@localhost ~]# ssh root@192.168.10.101 -p2222
登录后,使用 ifconfig 命令查看网络配置,确认是否登录到了正确的后端服务器。如果能成功登录并看到后端服务器的网络配置,说明四层代理配置成功。
四、Nginx 缓存
(一)缓存功能的核心原理和缓存类型
- 代理缓存:在反向代理场景下,Nginx 从后端服务器(如 Tomcat、Apache)获取响应内容并缓存。当客户端首次请求数据时,Nginx 若发现缓存中没有该数据,会向后端服务器请求,获取数据后返回给客户端并缓存。后续客户端再次请求相同数据时,Nginx 直接从缓存中读取并返回,减少后端服务器负载和响应时间。
- FastCGI 缓存:主要用于缓存通过 FastCGI 协议处理的动态内容,像 PHP、Python 等语言生成的页面数据。使用时通常需配合 PHP - FPM 等 FastCGI 进程管理器,提升动态内容的访问速度。
- uWSGI/SCGI 缓存:与 FastCGI 缓存类似,针对使用 uWSGI 或 SCGI 协议的后端应用,为这类应用提供缓存加速。
- 静态资源缓存:通过 expires 指令设置客户端浏览器缓存静态资源(如图片、CSS、JS 文件)的时间。这并非服务端缓存,而是让客户端在指定时间内直接从本地缓存读取资源,减少对服务端的请求。
(二)代理缓存功能设置
- 反向代理配置:首先要配置好七层反向代理,确保 Nginx 能正确转发请求到后端服务器。这部分配置与之前七层反向代理的配置类似,在 Nginx 配置文件中定义后端地址池和请求转发规则:
http {upstream backend {server 192.168.10.102:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
- 设置缓存功能:创建缓存目录并设置权限,然后在 Nginx 配置文件中定义缓存路径、参数、缓存键、缓存有效期等。
- 创建缓存目录并设置权限:
[root@localhost ~]# mkdir -p /data/nginx/cache
[root@localhost ~]# chown nginx:nginx /data/nginx/cache -R
- 编辑 Nginx 配置文件添加缓存相关配置:
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g use_temp_path=off;server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_cache my_cache;proxy_cache_key "$scheme$request_method$host$request_uri";proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5s;add_header X-Cache-Status $upstream_cache_status;}}
}
- 关键配置解析:
proxy_cache_path
:定义缓存文件存储路径为/data/nginx/cache
。levels=1:2
:表示缓存目录层级结构,将缓存文件按特定规则分布在不同层级目录,提高查找效率。keys_zone=my_cache:10m
:定义名为my_cache
的共享内存区域,大小为 10m,用于存储缓存键和元数据(如过期时间)。每 1MB 共享内存大约可存储 8000 个键。inactive=60m
:设置缓存内容的闲置有效期为 60 分钟。若 60 分钟内缓存内容未被访问,将被自动删除。max_size=1g
:限制缓存目录最大磁盘空间为 1GB。当缓存量达到 1GB 时,Nginx 启动 LRU(最近最少使用)算法清理旧缓存,为新缓存腾出空间。use_temp_path=off
:推荐设置为 off,使临时文件与缓存文件存储在同一目录,减少磁盘 I/O 操作,提升性能。
- 验证缓存功能:使用 curl 命令验证缓存功能。首次请求时,查看响应头中的
X - Cache - Status
字段,应为MISS
,表示未命中缓存;再次请求时,该字段应为HIT
,表示命中缓存。同时,可查看缓存目录(/data/nginx/cache
)确认数据已被缓存:
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# curl -I 192.168.10.101
[root@localhost ~]# ls /data/nginx/cache
五、Nginx rewrite 和正则
(一)Nginx 正则
- 常用正则表达式元字符:在学习 Nginx 的 Rewrite 模块前,需要熟悉正则表达式。常用的正则表达式元字符如下:
^
:匹配输入字符串的起始位置。例如,^hello
表示匹配以hello
开头的字符串。$
:匹配输入字符串的结束位置。例如,world$
表示匹配以world
结尾的字符串。*
:匹配前面的字符零次或多次。例如,go*
能匹配g
、go
、goo
等。+
:匹配前面的字符一次或多次。例如,go+
能匹配go
、goo
,但不能匹配g
。?
:匹配前面的字符零次或一次。例如,colou?r
能匹配color
或colour
。.
:匹配除\n
之外的任何单个字符。若要匹配包括\n
在内的任意字符,可使用[\s\S]
。\
:将后面接着的字符标记为一个特殊字符、原义字符或向后引用。例如,\n
匹配一个换行符,\\
匹配\
。\d
:匹配纯数字。例如,\d+
能匹配一个或多个数字组成的字符串。{n}
:重复 n 次。例如,a{3}
匹配aaa
。{n,}
:重复 n 次或更多次。例如,a{3,}
匹配aaa
、aaaa
等。[c]
:匹配单个字符c
。例如,[abc]
匹配a
、b
或c
。[a - z]
:匹配a - z
小写字母的任意一个。例如,[a - z]+
匹配由小写字母组成的字符串。[a - zA - Z]
:匹配a - z
小写字母或A - Z
大写字母的任意一个。
- 应用场景:Nginx 正则表达式在 Rewrite 规则中广泛应用,如路径美化(将
/product/123
转换为/index.php?id=123
)、旧链接迁移(将过期 URL 永久重定向到新地址)、强制 HTTPS / 域名统一(自动跳转http://
到https://
,合并www
与非www
域名)、动态路由(适配单页应用、RESTful API 路由)、灰度发布(按规则将部分流量导向新版本服务)等场景。
(二)nginx location
- 语法与匹配模式:location 是 Nginx 中用于匹配请求 URI(路径,仅对域名后边除去传递参数外的字符串起作用)的核心指令,用于根据请求路径定义不同的处理逻辑。其语法为
location [匹配模式] {处理逻辑(如root, proxy_pass, rewrite等)}
,匹配模式类型包括:location /uri
:普通前缀匹配,匹配以指定路径开头的 URI。例如,location /static/
匹配以/static/
开头的 URI。location = /
:精确匹配,仅匹配完全相同的 URI,优先级最高。例如,location = /index.html
只匹配/index.html
。location ~
:区分大小写的正则表达式匹配。例如,location ~ \.jpg$
匹配以.jpg
结尾的 URI。location ~*
:不区分大小写的正则表达式匹配。例如,location ~* \.jpg$
匹配以.jpg
或.JPG
结尾的 URI。location ^~
:精确前缀匹配,匹配前缀路径后,不再检查正则匹配,优先级高于正则。例如,location ^~ /static/
匹配以/static/
开头的 URI,且不再进行正则匹配。location /
:通用匹配,默认方式,优先级最低,其他方式匹配不到时匹配。
- 优先级规则:精确匹配 > 精确前缀匹配 > 正则匹配(
^~
和~
/~*
同时存在时,文件中物理位置靠上的优先) > 普通前缀匹配 > 通用匹配。 - 验证示例:编辑 Nginx 配置文件进行 location 验证:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下内容:
location / {return 200 "通用匹配";
}
location /abc {return 200 "普通前缀匹配";
}
location ~ /test/abcdef {return 200 "区分大小写正则";
}
location ~* /test/abc {return 200 "不区分大小写正则";
}
location ^~ /abcdef {return 200 "精确前缀匹配";
}
location = /abc {return 200 "精确匹配";
}
保存并重新加载 Nginx 配置:
[root@localhost ~]# nginx -s reload
使用 curl 命令测试不同的 URI:
[root@localhost ~]# curl 192.168.10.101/abc
每次请求192.168.10.101/abc
后,按优先级顺序依次注释配置文件中的 location,会发现每次的响应内容发生变更。使用正则模式时,URI 部分可以使用正则表达式,例如:
location ~ \. (jpg|png|gif)$ {# 处理图片请求的逻辑
}
(三)Rewrite
- 语法与执行顺序:Rewrite 用于对 URL 进行重写,其语法为
rewrite <regex><replacement> [flag];
。其中,regex
是用于正则匹配 URL 字符串的表达式(仅对域名后边除去传递参数外的字符串起作用),replacement
是重写跳转后的地址,flag
有以下几种类型:last
:重写后的 URI 会重新触发 location 匹配,并执行新匹配到的 location 块中的指令,是默认类型。break
:重写后的 URI 不会重新匹配 location,直接在当前 location 中处理,且后续的 rewrite 指令不再执行。redirect
:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新 url(因为是临时)。permanent
:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址,爬虫更新 url。- Rewrite 可以放在
server{}
、if{}
、location{}
配置段中,在不同配置段中的执行顺序和作用域不同:server{}
中的 rewrite:在请求进入 server 块后、匹配 location 前执行,影响该 server 块下所有请求(全局生效)。location{}
块中的 rewrite:在请求匹配到该 location 后执行,仅对该 location 匹配的请求生效(局部生效)。if{}
块中的 rewrite:在满足 if 条件时触发,作用域依赖 if 表达式所在的上下文(如在 server 中或 location 中)。
- flag 验证示例:编辑 Nginx 配置文件进行 flag 验证:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下内容进行last
标记验证:
default_type text/plain;
location /abc {rewrite ^/ /def last;
}
location /def {return 200 "this is def";
}
保存并重新加载 Nginx 配置,使用浏览器请求,会发现响应内容是this is def
,说明last
标记后继续向下匹配 location。
修改配置文件进行break
标记验证:
default_type text/plain;
location /abc {rewrite ^/ /def break;
}
location /def {return 200 "this is def";
}
重新加载配置后使用浏览器请求,会发现请求页面未找到,说明break
标记使用当前结果不继续向下匹配了。
类似地,对redirect
和permanent
标记进行验证,修改配置文件:
default_type text/plain;
location /abc {rewrite ^/ /def redirect;
}
location /def {return 200 "this is def";
}
重新加载配置后使用浏览器请求,会发现请求页面 302 跳转,并且地址栏显示的是跳转后的地址。
将redirect
改为permanent
进行验证,会发现请求页面 301 跳转,并且地址栏显示的是跳转后的地址。
3. 捕获组与引用:在 Nginx 的 rewrite 指令中,小括号()
用于定义正则表达式的捕获组(Capture Group)。捕获的文本可以通过$1
、$2
、$3
等变量在重写后的 URI 中引用。例如:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下内容:
location /category/ {rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {return 200 "Category: $1, ID: $2";
}
测试访问:
[root@localhost ~]# curl http://localhost/category/tech/456
会返回Category: tech, ID: 456
,说明捕获组正常工作。
4. set 指令:在 Nginx 中,set
指令用于定义变量并赋值,这些变量可以用于后续的条件判断、日志记录、重写规则等场景。语法为set $variable value;
。例如:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
添加如下内容:
location /demo {set $name "Nginx";return 200 "Hello, $name!";
}
测试访问:
[root@localhost ~]# curl http://localhost/demo
会返回Hello, Nginx!
,说明set
指令正常工作。
相关文章:
Nginx 核心功能02
目录 一、引言 二、正向代理 (一)正向代理基础概念 (二)Nginx 正向代理安装配置 (三)正向代理配置与验证 三、反向代理 (一)反向代理原理与应用场景 (二…...
c++题目_P1027 [NOIP 2001 提高组] Car 的旅行路线
P1027 [NOIP 2001 提高组] Car 的旅行路线 - 洛谷 # P1027 [NOIP 2001 提高组] Car 的旅行路线 ## 题目描述 又到暑假了,住在城市 A 的 Car 想和朋友一起去城市旅游。 她知道每个城市都有 $4$ 个飞机场,分别位于一个矩形的 $4$ 个顶点上,…...
【playwright】内网离线部署playwright
背景:安装好python3.9后,由于内网无法使用pip安装playwright,多方收集资料,终于部署完成,现汇总如下: 1、playwright需要python3.7以上的版本,如果低于这个版本先要将python解释器升级 2、在可…...
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
看完本篇你将基本了解webpack!!! 目录 一、Webpack 的作用 1、基本配置结构 2、配置项详解 1. entry —— 构建入口 2. output —— 输出配置 3. mode:模式设置 4. module:模块规则 5. plugins:插件机制 6. resolve:模块解析配置(可选) 7. devServer:开发服务器…...
ES6函数、对象和面向对象扩展
函数扩展 默认参数 通用的写法: function func(a, b, ..., c 默认值c, d 默认值d, ...) {... }其中,需要注意的是,有默认值的尽量写在后面并且所有形参参数不允许重复申明。具体例子: function test() {return 13 }// 函数可…...
航空客户价值分析阶段性测验
航空公司客户价值分析 学习目标 学会怎么进行数据分析。掌握hive的使用方法。学会数据清洗和K-Means聚类算法。 了解航空公司现状与客户价值分析 任务描述 面对激烈的市场竞争,各个航空公司都推出了更多的优惠来吸引客户。国内某航空公司面临着常旅客流失,竞争…...
纯html实现的json数据转csv文件
代码如下: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JSON转CSV转换器</tit…...
Windows 查看电脑是否插拔过U盘
1、按 “WinR” 组合键打开 “运行” 对话框,输入 “regedit” 并回车,打开注册表编辑器。 2、依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR注册表项,这里记录了所有已连接过的 USB 设备信息,包括 U 盘&am…...
VB.net序列化和反序列化的使用方法和实用场景
引言 相信很多初学编程的人都会提出过这个疑问:“既然我的变量可以存在内存之中,那么是否也可以存在硬盘之中呢” 其实我想回答的是,完全可以而且方法不止一种,而今天讲的是序列化最经典的——二进制序列化 由于序列化的部分已…...
kafka学习笔记(四、生产者(客户端)深入研究(二)——消费者协调器与_consumer_offsets剖析)
1.消费者协调器和组协调器 如果消费者客户端中配置了多个分配策略,则多消费者的分区分配交由消费者协调器和组协调器来完成,他们之间使用一套组协调协议进行交互。 1.1.在均衡原理 将全部消费者分成多个子集,每个消费者组的子集在服务中对…...
stm32基础001(串口)
文章目录 通信的基本概念串行通信和并行通信单工,半双工和全双工串口的硬件连接 stm32的串口原理图CPU的芯片手册stm32串口的库函数实现通过串口实现printf函数使用中断实现串口的接收 通信的基本概念 串行通信和并行通信 串行通信一个方向只有一个数据通道&#x…...
5G技术如何提升智能家居体验:让家更聪明,生活更智能
5G技术如何提升智能家居体验:让家更聪明,生活更智能 一、引言:智能家居的新纪元 近年来,智能家居已经逐渐走入我们的生活,家电、照明、安全设备、环境监控等产品,都在逐步实现智能化,让我们可以…...
在项目中如何对Map List等对象序列化及反序列化
我们知道,在自定义类中,若想完成序列化必须要实现Serializable接口。 那么在实现后如何进行序列化呢? 一.普通对象 序列化: 1.首先我们要定义一个 序列化所需要的工具类 ObjectMapper //定义序列化所需要的工具类 转化机器…...
指针与算法的双人舞:蓝桥杯两道趣味题的降维打击
蓝桥杯奇趣挑战:如何用指针和算法“驯服”无序数组与环形迷宫? 🎩 博客引言 "你是否有过这样的体验?面对一段看似混乱的数组,像解开一团纠缠的耳机线,想用最优雅的方式让它乖乖听话?又或者…...
C语言 指针(2)
目录 1.指针运算 2.const修饰指针 3.野指针 我们在上篇文章中初步了解了关于指针的基础内容,包括内存地址以及指针变量类型。这篇我们来 讲关于指针的运算以及const修饰指针和野指针相关内容。 1. 指针运算 指针的基本运算有三种,分别是: - 指针-…...
使用Python和Pandas实现的Azure Synapse Dedicated SQL pool权限检查与SQL生成用于IT审计
下面是使用 Python Pandas 来提取和展示 Azure Synapse Dedicated SQL Pool 中权限信息的完整过程,同时将其功能以自然语言描述,并自动构造所有权限设置的 SQL 语句: ✅ 步骤 1:从数据库读取权限信息 我们从数据库中提取与用户、…...
Python基本语法(控制语句)
#控制语句 Python语言的控制语句和其他编程语言类似,常用的有if…else、while、for语句。 案例2一7控制语句 第1组代码,说明if-else语句: #1 print(\n1,if) x,y,z10,20,5 if x>y:print(x>y) else:print(x<y)输出结果: 1,if x<…...
Linux btop 使用教程
简介 btop 是一个基于终端的现代系统资源监控器,具有美观的图形界面、响应快、功能丰富等特点。它支持查看 CPU、内存、磁盘、网络、进程,并可以方便地筛选和管理进程。 功能总览 启动命令: btop界面分为以下几部分: CPU 区域…...
高并发场景下的MySQL生存指南
引言 在2025年全球数字经济峰会上,阿里云披露其核心交易系统单日处理请求量突破万亿次,其中MySQL集群承载了78%的OLTP业务。这标志着数据库系统已进入百万级QPS时代,传统优化手段面临三大挑战: 一、硬件与架构优化:构…...
Ethan独立开发产品日报 | 2025-04-30
1. Daytona 安全且灵活的基础设施,用于运行你的人工智能生成代码。 Daytona Cloud重新定义了AI代理的基础设施,具备低于90毫秒的启动时间、原生性能和有状态执行能力,这些是传统云服务无法比拟的。您可以以前所未有的速度和灵活性来创建、管…...
Mysql常用函数解析
字符串函数 CONCAT(str1, str2, …) 将多个字符串连接成一个字符串。 SELECT CONCAT(Hello, , World); -- 输出: Hello WorldSUBSTRING(str, start, length) 截取字符串的子串(起始位置从1开始)。 SELECT SUBSTRING(MySQL, 3, 2); -- 输出: SQ…...
donet使用指定版本sdk
ps:来自微软官方方案,实测可行,就是在项目任意目录下在新建 global.json,并配置sdk版本 SDK 使用最新安装的版本 SDK 命令包括 dotnet new 和 dotnet run。 .NET CLI 必须为每个 dotnet 命令选择一个 SDK 版本。 即使在以下情况下,它也会默认使用计算机上安装的最新…...
Android短信监控技术实现:合法合规的远程采集方案
一年经验的全栈程序员,目前头发健在,但不知道能撑多久。 该项目已成功部署并稳定运行于企业生产环境,如需个性化定制方案,欢迎联系作者进行深度合作。 文章目录 前言 一、页面设计 1.页面显示 2.代码实现 二、具体代码实现 1.添加…...
前端项目实践:打造响应式个人简历与实时天气预报应用
在当今前端开发领域,构建实际项目是提升技能的最佳方式。本文将带你完成两个极具实用价值的前端项目:响应式个人简历页面和天气预报Web应用。这两个项目不仅能够丰富你的作品集,还能帮助你掌握现代前端开发的核心技术。 一、响应式个人简历页…...
【C++】extern
本文介绍一些extern在C中的用法 声明与定义分离 C程序员应该都知道单一定义规则ODR 在任何一个翻译单元中,只允许存在任何变量、函数、类类型、枚举类型 、概念 (自 C20 起) 或模板的一个定义(其中一些可能具有多个声明,但只允许一个定义&a…...
力扣——23合并升序链表
目录 1:题目描述: 2.算法思想: 3.代码展示: 1:题目描述: 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入ÿ…...
Java 泛型参数问题:‘ResponseData.this‘ cannot be referenced from a static contex
问题与处理策略 问题描述 Data AllArgsConstructor NoArgsConstructor public class ResponseData<T> {private Integer code;private String msg;private T data;public static final int CODE_SUCCESS 2001;public static final int CODE_FAIL 3001;public static …...
21 课时精通生成式 AI:微软官方入门指南详解
21课时精通生成式AI:微软官方入门指南详解 引言项目概述分析基本信息项目定位与目标 核心功能详解1. 全面的课程结构2. 多样化的学习内容3. 技术亮点与创新点 安装和使用教程环境要求安装步骤基本使用方法示例代码 应用场景和实际价值适用业务场景实际应用价值效益可…...
WPF嵌入webapi服务器,充当微服务角色
WPF嵌入WebAPI服务器实现微服务角色 一、方案概述 在WPF应用程序中嵌入WebAPI服务器,使其能够同时作为桌面客户端和微服务提供者。这种架构允许WPF应用既作为用户界面,又作为后端服务,适合需要本地处理能力同时又能提供API接口的场景。 二、技术选型 WebAPI框架:…...
构建现代分布式云架构的三大支柱:服务化、Service Mesh 与 Serverless
目录 前言1. 服务化架构模式:构建可扩展的基础单元1.1 服务化的定义与演进1.2 在分布式云中的价值1.3 面临的挑战 2. Service Mesh 架构:服务通信的治理中枢2.1 什么是 Service Mesh?2.2 功能与优势2.3 在分布式云中的角色2.4 落地难点 3. Se…...
2025华东杯数学建模B题完整分析论文(共36页)(含模型、代码、数据)
2025华东杯数学建模B题完整分析论文 摘要 一、问题重述 二、问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码 4.1.4问题1求解结果 4.2问题2 4.2.1问题2思路分析 4.2.2问题2模型建立 4.2…...
K8S - 零基础掌握 RBAC - 命名空间安全实战
一、为什么需要 RBAC 权限管理? 真实场景 在企业级 K8S 集群中,不同团队共享同一集群,容易发生权限管理问题,例如: 测试人员误删了生产数据库。 实习生看到了财务系统的敏感配置。 核心需求 确保不同用户 只能在自…...
OpenGL-ES 学习(13) ---- Shader 编译和程序对象
目录 概述创建和编译Shader链接程序对象绘制一个最简单的三角形示例代码 概述 在本节中,我们提供创建 Shader对象,并且编译链接到一个程序对象的完整流程,主要内容如下: Shader 和程序对象概述创建和编译Shader创建和链接程序对…...
今天的python练习题
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 晚上8点到的,还是会被感动到,有一位列车员同志在检票期间,叫我到列车员专座位上去坐,我很感激他,温暖人心,所以人间填我…...
HarmonyOS应用开发中实现本地化存储的几种方式
Preferences 存储 适用于存储简单的键值对数据,如用户设置、配置信息等。其特点是轻量级、使用简单,适合频繁读取和少量更新的场景,数据存储在本地沙盒中,应用重启后数据保持不变。 获取 Preferences 实例 :使用 data…...
【C++指南】vector(三):迭代器失效问题详解
. 💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 文章目录 一、引言二、reserve 扩容引发的迭代器失效2.1 问题现象2.2 正确实现 三、insert 插入引发的…...
Android面试总结之GC算法篇
一、GC 机制核心原理与算法 面试题 1:Android 中为什么采用分代回收?分代策略如何优化 GC 效率? 标准答案: 分代回收基于对象生命周期的差异,将堆分为年轻代(Young Gen)和老年代(Ol…...
驱动开发系列55 - Linux Graphics QXL显卡驱动代码分析(二)显存管理
一:概述 前面介绍了当内核检测到匹配的PCI设备后,会调用 qxl_pci_probe 初始化设备,其中会调用qxl_device_init 来初始化设备,为QXL设备进行内存映射,资源分配,环形缓冲区初始化,IRQ注册等操作,本文展开说说这些细节,以及介绍下QXL的显存管理。 二:QXL设备初始化细节…...
javaScript——DOM续(六)
滚轮事件 在 Web 开发中监听鼠标滚轮事件时,不同浏览器存在差异。下面是对 onmousewheel、DOMMouseScroll 和标准 wheel 事件的完整说明和兼容写法。 🌀 onmousewheel 事件概览 onmousewheel 是早期浏览器(如 IE 和 Chrome)支持…...
MySQL 服务搭建
💢欢迎来到张翊尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 在线安装Ubuntu/Debian更新系统包索引安装 MySQL …...
Eigen的使用
https://github.com/PX4/eigen Eigen在Qt中的配置(博主亲测) 1、Qt中调用 //.pro中-------- INCLUDEPATH \$$PWD/eigen-master//.cpp中------- #include <Eigen/Dense> using namespace Eigen;Matrix2d a; MatrixXd b(2,2); Vector3d v(1,2,3);…...
【云原生】基于Centos7 搭建Redis 6.2 操作实战详解
目录 一、前言 二、Redis 6.2 安装过程 2.1 下载安装包 2.2 安装包解压 2.3 安装包编译 2.3 安装 2.4 启动redis 2.4.1 前台启动(不推荐) 2.4.2 后启动(推荐) 2.4.3 关闭redis服务 2.4.4 设置客户端连接 三、写在最后 …...
《TCP/IP详解 卷1:协议》之第九章:IP选路
目录 一、IP选路之IP层工作流程 二、选路原理 三、路由表中的五种不同的标志(flag) 四、路由表的初始化 1、静态路由表初始化 ①、手动配置 ②、默认网关配置 2、动态路由表初始化 ①、路由协议的作用 ②、直接连接网络的自动发现 五、没有到达…...
HTTP知识速通
一.HTTP的基础概念 首先了解HTTP协议,他是目前主要使用在应用层的一种协议 http被称为超文本传输协议 而https则是安全的超文本传输协议 本章节的内容首先就是对http做一个简单的了解。 HTTP是一种应用层协议,是基于TCP/IP协议来传递信息的。 其中…...
npm命令介绍(Node Package Manager)
文章目录 npm命令全解析简介基础命令安装npm(npm -v检插版本)初始化项目(npm init)安装依赖包(npm install xxx、npm i xxx) 依赖管理精解依赖类型区分(生产环境依赖dependencies、开发环境依赖…...
在 Windows 上启用 Telnet 命令
在 Windows 上启用打开 Telnet 命令 Telnet 是一种用于远程访问和管理计算机的协议。尽管存在安全漏洞,Telnet 仍然被广泛用于初始网络硬件配置、远程访问、端口测试等任务。在 Windows 10 和 11 上,可以通过多种方法启用 Telnet 客户端。 使用控制面板…...
网络安全零基础培训 L1-9 PHP连接MySQL数据库
使用MySQLi扩展 MySQLi 是 “MySQL Improved Extension” 的缩写,它是 PHP 用于与 MySQL 数据库进行交互的扩展。 step1:连接数据库 <?php// 定义数据库服务器的地址,通常 localhost 表示本地服务器$servername "服务器地址&quo…...
Python生活手册-文件二进制:从快递柜到生鲜冷链的数据保鲜术
一、快递柜与冷链运输:两种存取哲学 1. 普通快递柜(文本模式) 日常存取包裹的智能快递柜就像文本模式,系统会自动处理包裹的包装: with open(快递单.txt, r, encodingutf-8) as 快递柜:包裹内容 快递柜.read() # …...
CUDA从入门到放弃
1 CUDA简介 GPU为图形处理器, 也是显卡的“大脑”显卡集成了GPU, 显存和其他电路的硬件GPU: 计算密集型CPU: 逻辑流控制GPU性能指标: 核心数GPU显存容量GPU计算峰值显存带宽 GPU不能单独计算, CPUGPU组成异构计算架构CPU起到控制作用, 一般成为主机(Host), GPU可以看作CPU的协…...
Golang多人在线坦克对战游戏(帧同步)
以下是一个简化但完整的同步帧游戏示例——实现一个多人在线坦克对战游戏。代码分为服务器和客户端两部分,使用UDP协议通信。我们将重点讲解核心同步机制。 项目结构 sync-frame-game/ ├── server/ │ ├── main.go # 游戏服务器主逻辑 │ └── game_stat…...