Nginx代理、缓存与Rewrite
目录
一、正向代理
(一)核心概念与应用场景
(二)Nginx正向代理编译安装(以OpenEuler为例)
(三)验证正向代理
二、反向代理
(一)七层代理(HTTP/HTTPS,应用层)
(二)四层代理(TCP/UDP,网络层)
三、代理缓存
(一)核心原理
(二)配置步骤(基于七层反向代理)
四、Rewrite与正则
(一)正则表达式基础
(二)Location匹配模式与优先级
(三)Rewrite语法与Flag参数
(四)捕获组与Set指令
五、总结
一、正向代理
(一)核心概念与应用场景
正向代理是客户端(如浏览器)的代理,客户端明确配置代理服务器,由代理服务器代为向目标服务器发起请求。其核心作用包括:
- 突破网络限制:访问被屏蔽的网站或资源。
- 节省带宽:缓存公共资源(如软件包、镜像文件),减少重复请求。
- 隐藏真实IP:客户端通过代理服务器访问目标,隐藏自身IP地址。
(二)Nginx正向代理编译安装(以OpenEuler为例)
1. 安装依赖软件
Nginx编译需要GCC、PCRE、Zlib、OpenSSL等开发包支持:
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
2. 创建专用用户与日志目录
为提升安全性,创建非交互式用户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
3. 下载与编译配置
- 解压Nginx源码(示例版本1.26.3),并下载支持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 \ --add-module=./ngx_http_proxy_connect_module # 关键:支持HTTPS转发
- 关键参数解析:
- --add-module:引入第三方模块,解决Nginx默认不支持HTTPS转发的问题。
- --with-http_ssl_module:开启HTTPS支持。
- --with-stream:支持TCP/UDP四层代理。
- 编译并安装:
[root@localhost nginx-1.26.3]# make && make install
4. 创建便捷执行链接
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
(三)验证正向代理
配置客户端(如Windows)的代理IP和端口为Nginx服务器地址,访问任意网站。通过查看Nginx访问日志(/usr/local/nginx/logs/access.log),可观察到客户端请求经代理转发,实现IP隐藏与流量代理。
二、反向代理
(一)七层代理(HTTP/HTTPS,应用层)
1. 核心功能与场景
- 负载均衡:将流量分发到多台后端服务器(如Tomcat、Apache),避免单点故障。
- 动静分离:静态资源(图片、CSS/JS)由Nginx直接响应,动态请求转发至后端。
- SSL终端:统一处理HTTPS加密/解密,减轻后端压力。
2. 实战配置:转发HTTP请求到后端Httpd服务器
- 环境准备(两台主机):
- 代理服务器(192.168.10.101):运行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
- 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; # 传递客户端真实IP } } }
- 验证:
[root@localhost ~]# curl 192.168.10.101 # 应返回“这是后端主机”
(二)四层代理(TCP/UDP,网络层)
1. 核心功能与场景
- 非HTTP服务代理:如数据库(MySQL/Redis)、游戏服务器(UDP协议)、SSH跳板机。
- 高性能转发:直接转发原始数据流,不解析应用层内容,低延迟。
2. 实战配置:SSH请求代理(端口2222转发到后端22)
stream { # 与http模块平级,独立处理TCP/UDP流量 upstream ssh_cluster { server 192.168.10.102:22; # 后端SSH服务地址 } server { listen 2222; # 代理服务器监听端口 proxy_pass ssh_cluster; # 转发到后端地址池 proxy_connect_timeout 5s; # 连接超时时间 proxy_timeout 1h; # 长连接保持时间 } }
- 验证:
[root@localhost ~]# ssh root@192.168.10.101 -p 2222 # 成功登录后端服务器
三、代理缓存
(一)核心原理
Nginx缓存后端服务器的响应内容,当相同请求再次到达时,直接返回缓存数据,减少后端压力并加速响应。支持按URL、请求方法、协议等维度缓存。
(二)配置步骤(基于七层反向代理)
1. 创建缓存目录并设置权限
[root@localhost ~]# mkdir -p /data/nginx/cache [root@localhost ~]# chown nginx:nginx /data/nginx/cache -R
2. 配置缓存参数
http { # 定义缓存路径与参数 proxy_cache_path /data/nginx/cache \ levels=1:2 \ # 缓存目录层级(一级目录1个字符,二级目录2个字符) keys_zone=my_cache:10m \ # 共享内存区,存储缓存键与元数据(10MB约存8万个键) inactive=60m \ # 60分钟未访问则删除缓存 max_size=1g \ # 最大缓存空间,超出后按LRU算法清理 use_temp_path=off; # 禁用临时文件,直接写入缓存目录提升性能 upstream backend { server 192.168.10.102:80; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_cache my_cache; # 启用名为my_cache的缓存区 proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键:协议+方法+主机+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; # 添加缓存状态头(调试用) } } }
3. 验证缓存效果
- 首次请求(MISS,未命中缓存):
[root@localhost ~]# curl -I 192.168.10.101 # 响应头包含:X-Cache-Status: MISS
- 再次请求(HIT,命中缓存):
[root@localhost ~]# curl -I 192.168.10.101 # 响应头包含:X-Cache-Status: HIT
四、Rewrite与正则
(一)正则表达式基础
Nginx Rewrite依赖正则匹配,常用元字符:
- ^:匹配字符串开头,如^/api匹配以/api开头的URI。
- $:匹配字符串结尾,如.jpg$匹配以.jpg结尾的文件。
- +:匹配前一个字符1次或多次,如ab+匹配ab、abb等。
- ():捕获组,如/user/(\d+)捕获用户ID到$1。
(二)Location匹配模式与优先级
1. 语法与模式
location [匹配模式] { ... }
- 精确匹配:location = /uri,优先级最高(如location = /index.html仅匹配完全相同的URI)。
- 正则匹配:location ~ /abc(区分大小写)、location ~* /ABC(不区分大小写)。
- 普通前缀:location /abc匹配以/abc开头的URI。
- 通用匹配:location /,优先级最低。
2. 优先级规则
精确匹配 > 精确前缀 > 正则匹配(文件中位置靠上的优先) > 普通前缀 > 通用匹配。
(三)Rewrite语法与Flag参数
1. 基本语法
rewrite [flag];
- regex:匹配当前URI的正则表达式(不包含域名和参数)。
- replacement:重写后的目标URI。
- flag:
- last:重写后重新匹配location(默认值)。
- break:重写后不再匹配location,直接处理当前请求。
- redirect:返回302临时重定向(浏览器地址栏更新)。
- permanent:返回301永久重定向(搜索引擎更新URL)。
2. 实战示例
- 路径美化:将/product/123转换为/index.php?id=123:
location /product/ { rewrite ^/product/(\d+)$ /index.php?id=$1 last; }
- 强制HTTPS跳转:
server { listen 80; server_name example.com; rewrite ^(.*)$ https://$server_name$1 permanent; # 永久重定向到HTTPS }
- 旧链接迁移(301永久重定向):
location /old-page { rewrite ^ /new-page permanent; }
(四)捕获组与Set指令
1. 捕获组应用
通过()捕获正则匹配内容,使用$1、$2引用:
location /category/ { # 匹配/category/tech/123,捕获“tech”到$1,“123”到$2 rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last; } location /archive/ { return 200 "Category: $1, ID: $2"; # 输出捕获结果 }
2. Set指令定义变量
location /demo { set $name "Nginx"; # 定义变量$name return 200 "Hello, $name!"; # 输出:Hello, Nginx! }
五、总结
本文全面解析了Nginx的三大核心功能:
- 正向代理:客户端代理,突破限制、隐藏IP。
- 反向代理:服务器端代理,支持七层(HTTP/HTTPS)与四层(TCP/UDP),实现负载均衡、动静分离等。
- 代理缓存:通过缓存后端响应,降低延迟、提升性能。
- Rewrite与正则:灵活控制URL,实现路径美化、重定向、动态路由等。
通过合理配置Nginx,可显著提升网站的性能、安全性和可维护性。在实际应用中,需根据业务需求选择合适的代理模式,结合缓存策略和Rewrite规则,打造高效稳定的Web应用架构。
- 旧链接迁移(301永久重定向):
- 强制HTTPS跳转:
- 路径美化:将/product/123转换为/index.php?id=123:
- 再次请求(HIT,命中缓存):
- 首次请求(MISS,未命中缓存):
- 验证:
- 验证:
- Nginx配置(代理服务器):
- 环境准备(两台主机):
- 编译并安装:
- 关键参数解析:
- 解压Nginx源码(示例版本1.26.3),并下载支持HTTPS转发的第三方模块ngx_http_proxy_connect_module(若源码已包含则无需下载):