Skip to content

🔄 nginx 反向代理进阶

不止是配个 proxy_pass——限流、缓存、负载均衡、WebSocket 代理,这才是生产级用法

假定你已经会 nginx 基础(不会的先去 /linux/ 分类看 nginx 相关文章)。


反向代理 vs 正向代理

正向代理反向代理
谁发起的客户端服务端
代理谁代理客户端出去代理服务器接收
隐藏谁客户端 IP后端服务器 IP
例子VPN、科学上网nginx 在服务器前面
正向代理:你 → 代理 → 互联网
反向代理:用户 → nginx → 后端服务器

基础反向代理

nginx
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

proxy_set_header 为啥要传这么多头

含义后端没这个会怎样
Host原始请求域名多站点时路由错乱
X-Real-IP用户真实 IP日志全记录 127.0.0.1
X-Forwarded-For代理链 IP同上
X-Forwarded-Proto原始协议(http/https)HTTPS 重定向死循环

限流

按请求频率限

nginx
# http 块里定义限速区
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        # burst=20: 突发允许排队 20 个
        # nodelay: 超出 part 的直接拒绝(不排队)
        proxy_pass http://127.0.0.1:3000;
    }
}

返回 503 给超限请求。配合前端友好提示。

按并发连接限

nginx
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location / {
        limit_conn conn_limit 5;   # 同一 IP 最多 5 个并发连接
        proxy_pass http://127.0.0.1:3000;
    }
}

缓存

nginx
# 定义缓存区
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:50m
                 max_size=1g inactive=60m use_temp_path=off;

server {
    location /api/static/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 10m;       # 200 响应缓存 10 分钟
        proxy_cache_valid 404 1m;         # 404 缓存 1 分钟
        proxy_cache_key "$scheme$request_method$host$request_uri";
        add_header X-Cache-Status $upstream_cache_status;

        proxy_pass http://127.0.0.1:3000;
    }

    # 手动清除缓存
    location ~ /purge(/.*) {
        proxy_cache_purge my_cache "$scheme$request_method$host$1";
    }
}

注意:API 缓存要小心——GET 静态数据可以缓存,POST/动态数据千万别缓存。


负载均衡

nginx
# 定义上游服务器组
upstream backend {
    # 轮询(默认)
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;

    # 或加权轮询
    # server 127.0.0.1:3000 weight=3;   # 处理 3/5 的请求
    # server 127.0.0.1:3001 weight=2;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

负载均衡策略

策略配置场景
轮询默认服务器配置相同
加权轮询weight=N服务器配置不同
IP Haship_hash;需要会话保持
最少连接least_conn;长连接场景
随机random;简单粗暴

WebSocket 代理

WebSocket 需要 HTTP Upgrade:

nginx
server {
    location /ws/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # WebSocket 超时要设长
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

超时配置

nginx
server {
    location / {
        proxy_pass http://127.0.0.1:3000;

        # 连接上游超时
        proxy_connect_timeout 10s;

        # 发送请求给上游超时
        proxy_send_timeout 30s;

        # 等待上游响应超时(长推理任务要调大)
        proxy_read_timeout 120s;

        # 给客户端返回响应超时
        send_timeout 30s;

        # 请求体最大大小
        client_max_body_size 100m;
    }
}

AI 推理服务的 proxy_read_timeout 必须调大——7B 模型推理一个长请求可能要 30-60 秒。


常用排故命令

bash
# 测试配置语法
sudo nginx -t

# 重载(不停机)
sudo nginx -s reload

# 看 error log
tail -f /var/log/nginx/error.log

# 看 access log
tail -f /var/log/nginx/access.log

# 列出所有 include 的文件
nginx -T 2>/dev/null | grep "# configuration file"

🎯 本章要点

  • proxy_set_header 至少传 Host + X-Real-IP + X-Forwarded-Proto
  • 限流:limit_req_zone 按请求频率,limit_conn 按并发
  • 缓存 API 只缓存 GET 静态数据,动态数据别缓存
  • WebSocket 代理要 Upgrade 头 + 超时调 3600s
  • AI 推理服务 proxy_read_timeout 调 120s+,否则长推理被 nginx 掐断
加载练习题中...

有问题或补充?欢迎留言