Nginx反向代理

代理类型对比

代理类型

代理对象

典型例子

作用

正向代理

代理客户端(用户)

SS、蓝灯(翻墙软件)

帮助客户端访问其无法直接访问的外部资源

反向代理

代理服务端(服务器)

Nginx反向代理

接收客户端请求,转发给内部服务器,并返回结果,对外表现为一个统一服务器

一句话区分:正向代理是“用户找代理帮自己做事”,反向代理是“服务器找代理帮自己接待访客”。

反向代理核心原理(流程图解)

  1. 客户端 → 发起请求 → 反向代理服务器(Nginx)

  2. 代理服务器 → 接收请求,并转发 → 后端业务服务器(真实Web服务器)

  3. 后端服务器 → 处理请求,生成响应 → 代理服务器

  4. 代理服务器 → 接收响应,返回给 → 客户端

关键作用:隐藏后端真实服务器,增强安全性,并可实现负载均衡、缓存等。

 【步骤详解版 - Nginx反向代理流程】
 ​
    客户端 (Client)
         │
         │ ① 发起HTTP请求 (例如: http://www.example.com/)
         ▼
 ┌───────────────────┐
 │  Nginx反向代理服务器 │  (监听公网80/443端口,对外表现为目标服务器)
 │  - 接收客户端请求   │
 │  - 识别请求域名/路径 │
 │  - 应用负载均衡策略  │
 └───────────────────┘
         │
         │ ② 根据配置(proxy_pass) 转发请求到内部服务器
         ▼
 ┌───────────────────┐
 │   后端真实服务器    │  (内网地址,如: http://192.168.8.100:8080)
 │  - 处理业务逻辑    │
 │  - 访问数据库等     │
 └───────────────────┘
         │
         │ ③ 生成HTTP响应,返回给Nginx
         ▼
 ┌───────────────────┐
 │  Nginx反向代理服务器 │
 │  - 可缓存响应内容   │
 │  - 可选压缩或修改响应│
 └───────────────────┘
         │
         │ ④ 将响应返回给客户端
         ▼
    客户端 (Client)

核心配置指令

反向代理实现

 location / {
     index index.php index.html index.htm;   #定义首页索引文件的名称
     proxy_pass http://后端服务器IP或域名;      # 请求转向后台服务器 
     # proxy_pass http://mysvr ;             #请求转向mysvr 定义的服务器列表
 }

基本反向代理

 server {
     listen 80;
     server_name api.example.com;
 ​
     location / {
         proxy_pass http://127.0.0.1:8080;           # 后端地址
         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;
         proxy_set_header X-Forwarded-Proto $scheme;  # 传递协议
     }
 }

反向代理优化

请求头转发

 location /api/ {
     proxy_pass http://backend:3000;
 ​
     proxy_set_header Host $host;                    # 传递原始域名给后端
     proxy_set_header X-Real-IP $remote_addr;        # 传递真实客户端IP
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链IP列表
     proxy_set_header X-Forwarded-Proto $scheme;     # 传递原始协议(http/https)
 }

超时配置

 location / {
     proxy_pass http://backend;
     proxy_connect_timeout 5;          # 连接后端超时时间(秒)
     proxy_send_timeout 10;            # 发送请求超时时间(秒)
     proxy_read_timeout 30;            # 等待响应超时时间(秒)
 }

代理缓存

 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
 ​
 location / {
     proxy_cache my_cache;
     proxy_cache_valid 200 302 60m;                     # 200/302 缓存 60 分钟
     proxy_cache_valid 404 1m;                          # 404 缓存 1 分钟
     proxy_cache_use_stale error timeout;               # 后端出错时用缓存
     add_header X-Cache-Status $upstream_cache_status;  # 查看缓存命中状态
 }

URL转发

 # 转发 /api/xxx → http://backend/api/xxx
 location /api/ {
     proxy_pass http://backend/;
 }
 ​
 # 转发 /api/xxx → http://backend/xxx(去掉 /api 前缀)
 location /api/ {
     proxy_pass http://backend/;
     rewrite ^/api/(.*)$ /$1 break;
 }

客户端请求体限制

     client_max_body_size 10m;        # 允许客户端请求的最大单文件大小
     client_body_buffer_size 128k;    # 缓冲客户端请求体的内存缓冲区大小

响应缓冲与性能优化

  proxy_buffer_size 4k;             # 存储响应头的缓冲区大小
     proxy_buffers 4 32k;             # 响应内容缓冲区(块数 × 每块大小)
     proxy_busy_buffers_size 64k;     # 高负荷下允许的最大缓冲区大小(通常为 proxy_buffers 单块 × 2)
     proxy_temp_file_write_size 64k;  # 响应超出缓冲区时,临时文件单次写入大小
 ​

目标服务器地址

  proxy_pass http://192.168.8.100;       # 请求转发目标
 }

进阶应用:负载均衡

通过 upstream 定义服务器组,实现请求分发。

配置案例模板:

 http {
     # 1. 定义后端服务器组
     upstream 组名 {
         server 后端IP1:端口;               # 例如:192.168.8.100:8080
         server 后端IP2:端口;               # 例如:192.168.8.101:8080
         # 可添加负载均衡策略,如 least_conn; (最少连接)
     }
 ​
     server {
         listen 80;
         server_name 你的域名.com;
 ​
         location / {
             proxy_pass http://组名;         # 转发到定义的服务器组
             # 此处可加入上述所有 proxy_set_header 和优化参数
         }
     }
 }

负载均衡默认策略:轮询(平均分配)。

三大应用场景速记

  1. 堡垒机/安全网关:代理暴露在外,保护内部业务服务器安全。

  2. 业务统一发布:将多个后端服务通过虚拟主机+反向代理整合到统一入口。

  3. 缓存加速(CDN):Nginx可缓存后端响应,直接返回给用户,加速访问。

记忆口诀与易错点

  • 核心区别口诀:“正向代理帮用户,反向代理护后端。”

  • 配置关键指令:“proxy_pass 定去向,upstream 组集群,proxy_set_header 传真身。”

  • 易错提醒:

    • proxy_pass 后的URL是否带斜杠/会影响请求路径的传递方式,需注意。

    • 配置修改后,务必执行 nginx -t 测试语法,再 nginx -s reload 平滑重启。