Nginx 核心功能全解析:正向代理 / 反向代理 / 缓存 / Rewrite 实战

前言

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 客户端验证(火狐浏览器)

以火狐浏览器为例,手动配置代理服务器,步骤如下:

  1. 打开火狐浏览器 → 右上角设置 → 常规 → 滑至底部网络设置 → 点击设置
  2. 选择手动配置代理 ,填写代理服务器信息:
    • HTTP 代理:192.168.10.101,端口:8080
    • 勾选也将此代理用于 HTTPS
  3. 点击确定,关闭设置页面,访问任意网站即可通过 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 代理缓存工作原理

代理缓存的核心工作流程为(以首次请求和二次请求为例):

  1. 客户端首次请求资源 A:Nginx 检查本地缓存,未找到资源 A,将请求转发至后端服务器;
  2. 后端服务器返回资源 A:Nginx 将资源 A 返回给客户端,同时将资源 A 缓存至本地磁盘;
  3. 客户端二次请求资源 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 指令仅能在serverlocationif配置块中使用。

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";
    }
}

分别请求四个测试地址,验证结果:

  1. curl 192.168.10.101/test_last:返回目标内容,last 标记重写后重新匹配 location
  2. curl 192.168.10.101/test_break:返回 404,break 标记重写后不继续匹配 location
  3. curl 192.168.10.101/test_redirect:返回 302 状态码,地址栏跳转为 /test_target;
  4. 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 的四大核心功能围绕 **"代理" 和 "流量调度"** 展开,各自承担着不同的业务角色,相辅相成:

  1. 正向代理:面向客户端,实现网络访问管控、匿名访问和资源缓存,是客户端的 "网络中间人";
  2. 反向代理:面向服务端,分为七层(HTTP/HTTPS)和四层(TCP/UDP),实现负载均衡、动静分离、服务高可用,是服务端的 "智能调度器";
  3. 代理缓存:基于反向代理,缓存后端服务响应内容,大幅提升服务响应速度,降低后端负载,是性能优化的核心手段;
  4. Rewrite 与正则:实现 URL 的灵活重写和重定向,结合 location 实现精细的流量调度,是 Nginx 的 "规则引擎"。
相关推荐
yqzyy2 小时前
Redis 设置密码无效问题解决
数据库·redis·缓存
coderwei1233 小时前
Ubantu服务器构建openclaw并接入飞书
运维·服务器
秦jh_3 小时前
【Redis】初识高并发分布式和Redis
数据库·redis·缓存
开开心心就好4 小时前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·windows·pdf·旅游·媒体·1024程序员节
心易行者4 小时前
别再说“在我的机器上能跑”了!Docker 入门指南,专治各种环境不服
运维·人工智能·docker·容器
ZKNOW甄知科技5 小时前
深度对标ServiceNow:燕千云如何破解企业全球化运维难题?
大数据·运维·人工智能·科技·ai·自动化·运维开发
进击切图仔5 小时前
ROS 跨机通信与 Docker 多机环境搭建
运维·docker·容器
主角1 75 小时前
Nginx核心功能
运维·nginx
cyber_两只龙宝5 小时前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构