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
指令正常工作。