目录
一、引言
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方法,支持HTTPS
proxy_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
指令正常工作。