主题
🔄 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 Hash | ip_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 掐断
加载练习题中...