前言
Nginx 作为高性能开源 Web 服务器与反向代理工具,凭借轻量级架构、高并发处理能力和灵活的模块化设计,成为现代 Web 架构的核心基石。从大型互联网企业的高可用架构到中小型项目的微服务部署,Nginx 都在负载均衡、缓存加速、安全防护、流量调度等场景中发挥着不可替代的作用。
本文将围绕 Nginx 四大核心功能展开详细讲解,包括正向代理 、反向代理(七层 / 四层) 、代理缓存 和Rewrite 正则重写,结合理论解析与实操案例,从环境搭建到配置验证,手把手教你掌握 Nginx 核心用法,为构建高效、稳定的 Web 服务打下坚实基础。
一、Nginx 正向代理:客户端的 "网络中间人"
1.1 正向代理核心概念
正向代理(Forward Proxy)是部署在客户端与目标服务器之间的代理服务,客户端的所有网络请求都会先发送至正向代理服务器,再由代理服务器转发至目标服务器,最终将响应结果返回给客户端。
Nginx 正向代理的核心作用是隐藏客户端真实 IP、管控网络访问、加速资源获取,典型应用场景包括:
- 内网访问控制:企业内部限制员工访问社交媒体、视频网站等非工作资源;
- 匿名网络访问:通过代理服务器隐藏客户端真实 IP,规避网络访问限制;
- 资源缓存加速:缓存外网公共资源(如软件安装包、镜像文件、静态资源),减少企业外网带宽消耗。
正向代理的访问链路为:浏览器 / 客户端 → 正向代理服务器 → 目标服务器。
1.2 正向代理环境搭建(编译安装 Nginx)
Nginx 默认不支持 HTTPS 正向代理,需编译安装第三方模块ngx_http_proxy_connect_module,以下为完整编译安装步骤(基于 OpenEuler/CentOS 系统)。
1.2.1 安装编译依赖
Nginx 编译运行依赖 pcre、zlib、openssl 等开发库,执行以下命令一键安装:
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
1.2.2 创建 Nginx 专用用户与日志目录
为提升 Nginx 运行安全性,避免使用 root 用户运行,创建无登录权限的专用用户,并指定日志目录:
# 创建nginx用户,不创建宿主目录,禁止Shell登录
useradd -M -s /sbin/nologin nginx
# 创建日志目录并修改权限
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
1.2.3 编译安装 Nginx(集成 HTTPS 代理模块)
本次使用 Nginx 1.26.3 版本,集成ngx_http_proxy_connect_module模块以支持 HTTPS 正向代理,编译参数兼顾 IP 透传、状态统计、SSL、TCP 代理等核心功能:
# 下载并解压Nginx源码
wget http://nginx.org/download/nginx-1.26.3.tar.gz
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
# 下载HTTPS正向代理模块
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
# 配置编译参数
./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 \
--add-module=./ngx_http_proxy_connect_module
# 编译并安装
make && make install
# 创建软链接,全局可执行nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
核心编译参数说明:
| 参数 | 功能 |
|---|---|
| --prefix=/usr/local/nginx | 指定 Nginx 安装目录 |
| --user/--group=nginx | 指定运行用户 / 组 |
| --with-http_ssl_module | 支持 HTTPS 协议 |
| --with-http_realip_module | 实现 IP 透传,获取客户端真实 IP |
| --with-http_stub_status_module | 支持 Nginx 状态统计,查看连接信息 |
| --with-stream | 支持四层 TCP/UDP 代理 |
| --add-module | 集成第三方 HTTPS 代理模块 |
1.2.4 添加 Nginx 系统服务
为方便通过systemctl管理 Nginx 的启动、停止、重载,编写系统服务配置文件:
vi /usr/lib/systemd/system/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
重新加载系统服务并设置开机自启:
# 重新加载服务配置
systemctl daemon-reload
# 设置开机自启
systemctl enable nginx
# 启动Nginx
systemctl start nginx
# 检查运行状态
systemctl status nginx
1.3 配置 Nginx 正向代理(支持 HTTP/HTTPS)
编辑 Nginx 主配置文件/usr/local/nginx/conf/nginx.conf,添加正向代理配置,核心是启用proxy_connect模块支持 HTTPS 的 CONNECT 方法,配置 DNS 解析器和代理超时参数。
1.3.1 正向代理核心配置
vi /usr/local/nginx/conf/nginx.conf
清空原有配置(保留基础结构),写入以下内容:
# 全局配置
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /usr/local/nginx/logs/nginx.pid;
events {
worker_connections 1024;
}
# HTTP核心配置
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# 正向代理服务配置
server {
listen 8080; # 正向代理监听端口
server_name localhost;
# DNS解析器,配置公共DNS(谷歌8.8.8.8+阿里云223.5.5.5)
resolver 8.8.8.8 223.5.5.5 valid=300s;
resolver_timeout 5s;
# 启用HTTPS代理CONNECT方法
proxy_connect;
proxy_connect_allow 443 80; # 允许代理的端口(80-HTTP,443-HTTPS)
proxy_connect_connect_timeout 10s; # 连接超时
proxy_connect_read_timeout 10s; # 读取超时
proxy_connect_send_timeout 10s; # 发送超时
# 处理所有HTTP/HTTPS请求
location / {
proxy_pass $scheme://$http_host$request_uri; # 动态转发至目标地址
proxy_set_header Host $http_host;
proxy_buffers 256 4k; # 优化缓冲区,提升转发性能
proxy_max_temp_file_size 0; # 禁用临时文件,减少磁盘IO
proxy_http_version 1.1; # 启用HTTP/1.1,保持长连接
proxy_set_header Connection ""; # 清空Connection头,由Nginx管理
}
}
}
1.3.2 配置验证与重载
修改配置后,必须先验证语法正确性,再重载 Nginx,避免配置错误导致服务宕机:
# 验证配置语法
nginx -t
# 语法正确则重载配置
nginx -s reload
若输出nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok,表示配置无问题。
1.4 正向代理功能验证
分别在Linux 客户端 和Windows 客户端验证正向代理功能,确保 HTTP 和 HTTPS 请求均可通过代理服务器转发。
1.4.1 Linux 客户端验证(curl 命令)
使用curl -x参数指定代理服务器 IP 和端口,访问百度、淘宝等网站测试:
# 访问HTTP网站
curl -x http://192.168.10.101:8080 www.baidu.com
# 访问HTTPS网站
curl -x http://192.168.10.101:8080 https://www.taobao.com
若能正常返回网页源码,说明正向代理配置成功。
1.4.2 Windows 客户端验证(火狐浏览器)
以火狐浏览器为例,手动配置代理服务器,步骤如下:
- 打开火狐浏览器 → 右上角设置 → 常规 → 滑至底部网络设置 → 点击设置;
- 选择手动配置代理 ,填写代理服务器信息:
- HTTP 代理:
192.168.10.101,端口:8080; - 勾选也将此代理用于 HTTPS;
- HTTP 代理:
- 点击确定,关闭设置页面,访问任意网站即可通过 Nginx 正向代理转发。
1.4.3 验证代理有效性(查看 Nginx 访问日志)
通过查看 Nginx 的访问日志,可确认客户端的所有请求均通过代理服务器转发,且日志中仅显示代理服务器 IP,隐藏了客户端真实 IP:
tail -f /var/log/nginx/access.log
二、Nginx 反向代理:服务端的 "智能调度器"
2.1 反向代理核心概念
反向代理(Reverse Proxy)是部署在服务端集群前端的代理服务,客户端向反向代理服务器发送请求,代理服务器根据配置规则将请求转发至后端的应用服务器(如 Apache、Tomcat、Httpd),并将后端服务器的响应结果返回给客户端。
客户端无需知道后端应用服务器的真实 IP 和端口,仅需访问反向代理服务器的地址,因此反向代理也被称为服务端的 "智能调度器"。
Nginx 支持七层反向代理(应用层)和四层反向代理(网络层),二者的核心区别在于是否解析应用层协议(如 HTTP/HTTPS)。
2.2 七层反向代理(HTTP/HTTPS)
七层反向代理基于HTTP/HTTPS 协议,可深度解析应用层内容(如 URL、Header、Cookie、请求参数),实现精准的请求转发和业务调度,是 Web 服务中最常用的代理方式。
2.2.1 七层反向代理典型应用场景
- 负载均衡:将客户端流量分发至多台后端应用服务器,避免单点故障,提升服务可用性;
- 动静分离:静态资源(图片、CSS、JS、HTML)由 Nginx 直接响应,动态请求(PHP、Java、API)转发至后端应用服务器,提升服务响应速度;
- SSL 终端:由 Nginx 统一处理 HTTPS 的加密和解密,降低后端服务器的计算压力;
- 灰度发布:根据客户端 IP、请求 Header 等特征,将部分流量导向新版本服务,实现平滑升级。
七层反向代理的访问链路为:浏览器 / 客户端 → Nginx 七层反向代理 → 后端 HTTP/HTTPS 应用服务器。
2.2.2 七层反向代理实操案例(Nginx 转发至 Httpd)
本次实验采用两台主机搭建环境,实现 Nginx 将 HTTP 请求转发至后端 Httpd 服务器,拓扑如下:
| 服务器 | 系统配置 | IP 地址 | 部署服务 |
|---|---|---|---|
| 代理服务器 | 2C4G | 192.168.10.101 | Nginx |
| 后端服务器 | 2C4G | 192.168.10.102 | Httpd |
步骤 1:部署后端 Httpd 服务(192.168.10.102)
# 关闭防火墙(生产环境建议开放80端口)
systemctl stop firewalld && systemctl disable firewalld
# 安装Httpd
dnf install -y httpd
# 编写测试页面
echo "这是后端Httpd服务器(192.168.10.102)" > /var/www/html/index.html
# 启动Httpd并设置开机自启
systemctl start httpd && systemctl enable httpd
# 本地测试Httpd服务
curl 127.0.0.1
若输出测试页面内容,说明 Httpd 服务部署成功。
步骤 2:配置 Nginx 七层反向代理(192.168.10.101)
编辑 Nginx 主配置文件,通过upstream定义后端服务器地址池,使用proxy_pass实现请求转发:
vi /usr/local/nginx/conf/nginx.conf
修改 HTTP 模块配置,添加upstream和反向代理规则:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 定义后端服务器地址池(可添加多台,实现负载均衡)
upstream backend_http {
server 192.168.10.102:80; # 后端Httpd服务器
# server 192.168.10.103:80; # 可添加多台后端服务器
}
# 反向代理服务配置
server {
listen 80;
server_name 192.168.10.101;
# 所有请求转发至后端地址池
location / {
proxy_pass http://backend_http; # 转发至upstream定义的地址池
proxy_set_header Host $host; # 将客户端Host头传递至后端
proxy_set_header X-Real-IP $remote_addr; # 透传客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 透传代理链路IP
}
}
}
步骤 3:配置验证与功能测试
# 验证Nginx配置语法
nginx -t
# 重载Nginx配置
nginx -s reload
# 测试反向代理(在代理服务器/任意客户端执行)
curl 192.168.10.101
若输出这是后端Httpd服务器(192.168.10.102),说明七层反向代理配置成功,客户端访问 Nginx 的 80 端口,请求被转发至后端 Httpd 服务器。
2.3 四层反向代理(TCP/UDP)
四层反向代理基于TCP/UDP 协议 ,仅转发网络层的原始数据流,不解析应用层内容,具有高性能、低延迟的特点,适用于非 HTTP 协议的服务代理,如数据库、SSH、游戏服务器、MQTT 等。
2.3.1 四层反向代理典型应用场景
- 数据库代理:对外暴露统一的数据库访问端口,内部转发至 MySQL、Redis 集群,实现数据库访问管控;
- SSH 跳板机:通过端口映射,实现对内网服务器的安全 SSH 访问,避免内网服务器直接暴露在外网;
- 游戏服务器代理:代理 UDP 协议的实时游戏数据包,实现负载均衡和高可用;
- TCP 服务高可用:为 MQTT、Redis 等 TCP 服务实现主备切换和健康检查。
四层反向代理的核心配置模块是stream,该模块需与 http 模块平级,不能嵌套在 http 模块内部。
2.3.2 四层反向代理实操案例(Nginx 代理 SSH 服务)
实现客户端通过访问 Nginx 代理服务器的 2222 端口,SSH 登录至后端 192.168.10.102 服务器的 22 端口。
步骤 1:配置 Nginx 四层反向代理(192.168.10.101)
编辑 Nginx 主配置文件,添加stream模块配置:
vi /usr/local/nginx/conf/nginx.conf
在配置文件末尾添加stream模块(与 http 平级):
# 四层TCP代理模块(与http平级)
stream {
# 定义后端SSH服务器地址池
upstream backend_ssh {
server 192.168.10.102:22; # 后端服务器SSH端口
}
# 监听2222端口,转发SSH请求
server {
listen 2222; # 代理监听端口
proxy_pass backend_ssh; # 转发至后端SSH地址池
proxy_connect_timeout 5s; # 连接超时
proxy_timeout 1h; # 长连接保持时间(SSH建议设置较长)
}
}
步骤 2:配置验证与端口监听检查
# 验证配置语法
nginx -t
# 重载配置
nginx -s reload
# 检查2222端口是否监听
ss -nlpt | grep 2222
若输出LISTEN 0 511 0.0.0.0:2222 0.0.0.0:*,说明端口监听成功。
步骤 3:SSH 代理功能测试
在任意客户端执行以下命令,通过代理服务器的 2222 端口登录后端服务器:
ssh root@192.168.10.101 -p2222
输入后端服务器 192.168.10.102 的 root 密码,若能成功登录,说明四层反向代理配置成功。
三、Nginx 代理缓存:提升服务响应速度的核心手段
3.1 代理缓存核心概念
Nginx 的缓存功能主要基于反向代理缓存(Proxy Cache),部署在反向代理服务器上,用于缓存后端应用服务器的响应内容(如静态页面、接口返回数据)。当客户端再次请求相同资源时,Nginx 直接从本地缓存中返回数据,无需转发至后端服务器,大幅提升服务响应速度,同时降低后端服务器的负载。
3.1.1 Nginx 缓存核心类型
Nginx 支持多种缓存类型,适用于不同业务场景,核心类型如下:
| 缓存类型 | 作用场景 |
|---|---|
| 代理缓存(Proxy Cache) | 反向代理模式下,缓存后端 HTTP/HTTPS 服务器的响应内容 |
| FastCGI 缓存 | 缓存 PHP/Python 等通过 FastCGI 协议处理的动态内容(需配合 PHP-FPM) |
| uWSGI/SCGI 缓存 | 类似 FastCGI 缓存,适用于 uWSGI/SCGI 协议的后端服务 |
| 静态资源缓存 | 通过expires指令设置客户端浏览器缓存,减少服务端请求(非服务端缓存) |
3.1.2 代理缓存工作原理
代理缓存的核心工作流程为(以首次请求和二次请求为例):
- 客户端首次请求资源 A:Nginx 检查本地缓存,未找到资源 A,将请求转发至后端服务器;
- 后端服务器返回资源 A:Nginx 将资源 A 返回给客户端,同时将资源 A 缓存至本地磁盘;
- 客户端二次请求资源 A:Nginx 检查本地缓存,找到未过期的资源 A,直接从缓存返回数据,不转发至后端服务器。
3.2 代理缓存实操配置(基于七层反向代理)
Nginx 代理缓存需基于七层反向代理配置,本次在之前的七层反向代理基础上,添加缓存配置,实现对后端 Httpd 服务器响应内容的缓存。
3.2.1 步骤 1:创建缓存目录并修改权限
创建缓存文件存储目录,确保 Nginx 有读写权限:
# 创建缓存目录
mkdir -p /data/nginx/cache
# 修改目录权限为nginx用户
chown -R nginx:nginx /data/nginx/cache
3.2.2 步骤 2:配置 Nginx 代理缓存
编辑 Nginx 主配置文件,在http模块中定义缓存全局参数,在location模块中启用缓存:
vi /usr/local/nginx/conf/nginx.conf
修改后的核心配置如下:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 定义代理缓存全局参数(http模块内)
proxy_cache_path /data/nginx/cache # 缓存文件存储路径
levels=1:2 # 缓存目录层级(1级目录+2级子目录,减少单目录文件数)
keys_zone=my_cache:10m # 共享内存区域(my_cache为名称,10m为大小,存储缓存键和元数据)
inactive=60m # 缓存闲置有效期(60分钟未访问则自动删除)
max_size=1g # 缓存最大磁盘空间(1GB,超出后触发LRU算法清理旧缓存)
use_temp_path=off; # 禁用临时目录,缓存文件直接写入目标目录,减少磁盘IO
# 后端服务器地址池
upstream backend_http {
server 192.168.10.102:80;
}
server {
listen 80;
server_name 192.168.10.101;
location / {
proxy_pass http://backend_http;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 启用代理缓存(引用http模块定义的my_cache)
proxy_cache my_cache;
# 定义缓存键(唯一标识缓存资源,由协议+请求方法+主机+请求路径组成)
proxy_cache_key "$scheme$request_method$host$request_uri";
# 不同状态码的缓存有效期
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
proxy_cache_valid any 5s; # 其他状态码缓存5秒
# 添加缓存状态响应头(调试用,可查看缓存是否命中)
add_header X-Cache-Status $upstream_cache_status;
}
}
}
核心缓存配置参数说明:
proxy_cache_path:定义缓存的全局参数,必须在http模块中配置;keys_zone:共享内存区域,用于快速查询缓存状态,1MB 约可存储 8000 个缓存键;inactive:缓存闲置有效期,即使缓存未到过期时间,若超出该时间未访问也会被清理;max_size:缓存最大磁盘空间,超出后 Nginx 会通过 **LRU(最近最少使用)** 算法自动清理最久未使用的缓存;proxy_cache_key:缓存的唯一标识,确保相同请求的缓存键一致,不同请求的缓存键唯一;X-Cache-Status:缓存状态响应头,取值包括MISS(未命中)、HIT(命中)、EXPIRED(过期)、BYPASS(绕过)。
3.2.3 步骤 3:配置验证与重载
nginx -t && nginx -s reload
3.3 代理缓存功能验证
使用curl -I命令发送请求,查看响应头中的X-Cache-Status字段,验证缓存是否命中。
3.3.1 首次请求(缓存未命中)
curl -I 192.168.10.101
响应头中会显示X-Cache-Status: MISS,表示缓存未命中,Nginx 从后端服务器获取数据并缓存。
3.3.2 二次请求(缓存命中)
在 10 分钟缓存有效期内,再次发送相同请求:
curl -I 192.168.10.101
响应头中会显示X-Cache-Status: HIT,表示缓存命中,Nginx 直接从本地缓存返回数据。
3.3.3 查看本地缓存文件
缓存命中后,可在缓存目录中看到生成的缓存文件,验证缓存是否实际写入:
ls /data/nginx/cache
四、Nginx Rewrite 与正则:流量调度的 "规则引擎"
Rewrite 是 Nginx 的URL 重写模块 ,结合正则表达式实现对 URL 的灵活修改、跳转和重定向,被称为 Nginx 的 "规则引擎"。Rewrite 常与location结合使用,实现路径美化、旧链接迁移、强制 HTTPS、动态路由等业务需求。
4.1 必备基础:Nginx 正则表达式
Rewrite 的核心是正则表达式匹配,Nginx 支持标准的正则表达式元字符,以下为开发中最常用的元字符及说明:
| 元字符 | 描述 | 示例 |
|---|---|---|
| ^ | 匹配输入字符串的起始位置 | ^/api:匹配以 /api 开头的 URL |
| $ | 匹配输入字符串的结束位置 | /$:匹配以 / 结尾的 URL |
| * | 匹配前面的字符零次或多次 | ol*:匹配 o、ol、oll 等 |
| + | 匹配前面的字符一次或多次 | ol+:匹配 ol、oll 等,不匹配 o |
| ? | 匹配前面的字符零次或一次 | do (es)?:匹配 do、does |
| . | 匹配除 \n 外的任意单个字符 | .*:匹配任意字符 |
| \ | 转义字符,匹配特殊字符 | .:匹配点号(.) |
| \d | 匹配纯数字 | \d+:匹配任意长度的数字 |
| {n} | 匹配前面的字符 n 次 | \d {3}:匹配 3 位数字 |
| {n,} | 匹配前面的字符 n 次及以上 | \d {2,}:匹配 2 位及以上数字 |
| [a-z] | 匹配小写字母 a-z | [a-z]+:匹配任意小写字母 |
| [a-zA-Z] | 匹配大小写字母 | [a-zA-Z]+:匹配任意字母 |
4.2 核心前置:Nginx location 匹配
location是 Nginx 用于匹配请求 URI 的核心指令,Rewrite 通常与location结合使用,实现更精细的路径控制。location的匹配优先级直接影响 Rewrite 的执行效果,需先掌握location的匹配规则。
4.2.1 location 匹配模式
location 支持 5 种匹配模式,不同模式的优先级不同,语法为:location [匹配模式] /uri { 处理逻辑 }。
| 匹配模式 | 语法 | 说明 | 优先级 |
|---|---|---|---|
| 精确匹配 | location = /uri | 仅匹配与 /uri 完全相同的请求 | 最高(1) |
| 精确前缀匹配 | location ^~ /uri | 匹配以 /uri 开头的请求,不继续匹配正则 | 次高(2) |
| 正则匹配(区分大小写) | location ~ /uri | 以正则表达式匹配请求,区分大小写 | 中等(3) |
| 正则匹配(不区分大小写) | location ~* /uri | 以正则表达式匹配请求,不区分大小写 | 中等(3) |
| 普通前缀匹配 | location /uri | 匹配以 /uri 开头的请求,优先级低于正则 | 次低(4) |
| 通用匹配 | location / | 匹配所有未被其他 location 匹配的请求 | 最低(5) |
注意 :若存在多个正则匹配模式(~ 和~*),配置文件中物理位置靠上的优先。
4.2.2 location 匹配优先级验证
配置不同的 location 匹配模式,通过 curl 请求验证匹配结果:
server {
listen 80;
server_name 192.168.10.101;
default_type text/plain;
# 精确匹配
location = /abc {
return 200 "精确匹配";
}
# 精确前缀匹配
location ^~ /abcdef {
return 200 "精确前缀匹配";
}
# 正则匹配(区分大小写)
location ~ /test/abcdef {
return 200 "区分大小写正则匹配";
}
# 正则匹配(不区分大小写)
location ~* /test/abc {
return 200 "不区分大小写正则匹配";
}
# 普通前缀匹配
location /abc {
return 200 "普通前缀匹配";
}
# 通用匹配
location / {
return 200 "通用匹配";
}
}
重载配置后,执行以下请求,验证匹配结果:
curl 192.168.10.101/abc # 精确匹配
curl 192.168.10.101/abcdef # 精确前缀匹配
curl 192.168.10.101/test/ABC # 不区分大小写正则匹配
curl 192.168.10.101/abcd # 普通前缀匹配
curl 192.168.10.101/123 # 通用匹配
4.3 Rewrite 核心语法与 Flag 标记
4.3.1 Rewrite 基本语法
Rewrite 指令的基本语法为:
rewrite <regex> <replacement> [flag];
- regex:正则表达式,匹配需要重写的 URL(仅匹配域名后的请求路径,不包含请求参数);
- replacement:重写后的 URL,即跳转的目标地址;
- flag:重写标记,控制重写后的执行行为,是 Rewrite 的核心。
4.3.2 Rewrite 核心 Flag 标记
Flag 标记决定了重写后的 URL 是否继续匹配 location、是否重定向,核心标记有 4 种,功能如下:
| Flag 标记 | 核心功能 | 适用场景 |
|---|---|---|
| last | 重写后的 URL 重新触发 location 匹配,执行新 location 的逻辑 | 服务端内部重写,地址栏不变 |
| break | 重写后的 URL 不继续匹配 location,直接在当前 location 处理 | 服务端内部重写,终止后续匹配 |
| redirect | 返回 302 临时重定向,浏览器地址栏显示新 URL | 临时 URL 跳转,爬虫不更新 URL |
| permanent | 返回 301 永久重定向,浏览器地址栏显示新 URL | 永久 URL 迁移,爬虫更新 URL |
注意 :Rewrite 指令仅能在server、location、if配置块中使用。
4.3.3 Flag 标记实操验证
通过简单配置,验证 4 种 Flag 标记的核心差异,配置如下:
server {
listen 80;
server_name 192.168.10.101;
default_type text/plain;
# 测试last标记
location /test_last {
rewrite ^/test_last /test target last;
}
# 测试break标记
location /test_break {
rewrite ^/test_break /test_target break;
}
# 测试redirect标记
location /test_redirect {
rewrite ^/test_redirect /test_target redirect;
}
# 测试permanent标记
location /test_permanent {
rewrite ^/test_permanent /test_target permanent;
}
# 目标location
location /test_target {
return 200 "Rewrite成功,命中目标location";
}
}
分别请求四个测试地址,验证结果:
curl 192.168.10.101/test_last:返回目标内容,last 标记重写后重新匹配 location;curl 192.168.10.101/test_break:返回 404,break 标记重写后不继续匹配 location;curl 192.168.10.101/test_redirect:返回 302 状态码,地址栏跳转为 /test_target;curl 192.168.10.101/test_permanent:返回 301 状态码,地址栏跳转为 /test_target。
4.4 Rewrite 高级用法:捕获组与变量
4.4.1 正则捕获组
Rewrite 支持通过 ** 小括号 ()** 定义正则捕获组,将匹配到的内容按顺序存入$1、$2、$3等变量中,在replacement中引用,实现动态 URL 重写。
实操案例 :将/category/分类/ID的 URL 重写为/archive/分类/ID,配置如下:
location /category/ {
# 正则捕获组:(.+)匹配分类,(\d+)匹配数字ID
rewrite /category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {
# 引用捕获组变量,返回结果
return 200 "分类:$1,ID:$2";
}
测试请求:
curl 192.168.10.101/category/tech/10086
输出结果:分类:tech,ID:10086,说明捕获组成功匹配并引用。
4.4.2 set 指令定义自定义变量
Nginx 的set指令可定义自定义变量,赋值后在 Rewrite、location、if 中引用,实现更灵活的逻辑控制,语法为:
set $variable value;
实操案例:定义自定义变量,实现动态响应:
location /demo {
set $name "Nginx";
set $version "1.26.3";
return 200 "Hello, $name! 版本:$version";
}
测试请求:
curl 192.168.10.101/demo
输出结果:Hello, Nginx! 版本:1.26.3。
4.5 Rewrite 典型应用场景
4.5.1 强制将 HTTP 跳转至 HTTPS
server {
listen 80;
server_name www.example.com;
# 永久重定向至HTTPS
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name www.example.com;
# SSL配置省略
location / {
root html;
index index.html;
}
}
4.5.2 统一域名(www 与非 www 跳转)
server {
listen 80;
server_name example.com;
# 非www跳转至www
rewrite ^(.*)$ http://www.example.com$1 permanent;
}
4.5.3 旧链接迁移(永久重定向)
# 旧链接/old.html跳转至新链接/new.html
location /old.html {
rewrite ^/old.html$ /new.html permanent;
}
4.5.4 路径美化(隐藏动态参数)
将/index.php?id=123美化为/product/123:
location /product/ {
rewrite ^/product/(\d+)$ /index.php?id=$1 last;
}
五、总结
Nginx 的四大核心功能围绕 **"代理" 和 "流量调度"** 展开,各自承担着不同的业务角色,相辅相成:
- 正向代理:面向客户端,实现网络访问管控、匿名访问和资源缓存,是客户端的 "网络中间人";
- 反向代理:面向服务端,分为七层(HTTP/HTTPS)和四层(TCP/UDP),实现负载均衡、动静分离、服务高可用,是服务端的 "智能调度器";
- 代理缓存:基于反向代理,缓存后端服务响应内容,大幅提升服务响应速度,降低后端负载,是性能优化的核心手段;
- Rewrite 与正则:实现 URL 的灵活重写和重定向,结合 location 实现精细的流量调度,是 Nginx 的 "规则引擎"。