Nginx配置反向代理有何技巧
小樊
42
2025-12-08 21:42:58
Nginx 反向代理配置技巧
一 基础与必备头信息
- 使用 proxy_pass 指定后端地址;在 location 中转发时,注意路径末尾斜杠对 URI 拼接的影响:当 location 有路径前缀且 proxy_pass 目标也以斜杠结尾时,Nginx 会用 location 匹配后的剩余部分拼接到后端地址。示例:location /api/ { proxy_pass http://127.0.0.1:3000/; } 会把 /api/foo 转发为 /foo。若不加斜杠,可能保留 /api/ 前缀导致 404。
- 始终显式设置转发头,确保后端获取真实客户端信息:
- 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;(告知后端原始是 http 还是 https)
- 常用超时控制:
- proxy_connect_timeout 60s;(连接后端超时)
- proxy_read_timeout 120s;(读取后端响应超时)
- proxy_send_timeout 120s;(发送请求到后端超时)
- 变更后先执行 nginx -t 校验,再 systemctl reload nginx 生效。
二 负载均衡与健康检查
- 使用 upstream 定义后端组,按需选择策略:
- 轮询(默认)、least_conn(最少连接)、ip_hash(会话保持)、weight(权重)、backup(备用)。
- 示例:
- upstream backend_servers {
least_conn;
server 192.168.1.100:8080 weight=3;
server 192.168.1.101:8080;
server 192.168.1.102:8080 backup;
}
- server { listen 80; server_name example.com; location / { proxy_pass http://backend_servers; proxy_set_header Host $host; } }
- 建议为上游开启长连接复用:在 upstream 内配置 keepalive 32;,减少频繁建连开销。
三 性能与安全优化
- 进程与连接:
- worker_processes auto;(通常设为 CPU 核心数)
- events { worker_connections 1024+; use epoll; multi_accept on; }
- 提升文件描述符限制:worker_rlimit_nofile 40000;
- 传输与压缩:
- 启用 sendfile on; tcp_nopush on; tcp_nodelay on;
- 开启 gzip on; gzip_comp_level 5; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
- 上游长连接:在 upstream 中配置 keepalive 32;,并在 location 中设置 proxy_http_version 1.1; proxy_set_header Connection “”; 以复用连接。
- 缓冲与缓存:
- 静态资源或稳定接口可开启 proxy_buffering on; 并合理设置 proxy_buffer_size / proxy_buffers;大文件或流媒体可关闭缓冲:proxy_buffering off;
- 定义共享内存缓存:
- proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
- location / { proxy_cache my_cache; proxy_pass http://backend; }
- 安全加固:
- 反向代理可集中处理 SSL/TLS 卸载、隐藏后端真实 IP、统一 WAF/访问控制 策略。
四 高级场景配置要点
- WebSocket:
- 升级协议与长连接:
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection “Upgrade”;
- HTTPS 终端:在 server 块配置 ssl_certificate /path/fullchain.pem; ssl_certificate_key /path/privkey.pem; 并在 proxy_set_header X-Forwarded-Proto https; 告知后端。
- 路径重写与跳转:使用 proxy_redirect 修正后端返回的 Location 头;必要时配合 rewrite 做路径前缀处理。
- 静态资源直出:对静态文件单独 location,直接 root /data/static; 或配合 proxy_cache 提升命中率。
- 典型片段(WebSocket):
- location /ws/ {
proxy_pass http://backend_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”;
proxy_read_timeout 3600s;
}
五 排错清单与最佳实践
- 路径转发不符预期:核对 location 与 proxy_pass 是否带斜杠,必要时调整拼接规则。
- 后端拿不到真实 IP:确认已设置 X-Real-IP / X-Forwarded-For / X-Forwarded-Proto。
- WebSocket 失败:缺少 Upgrade/Connection 头或 proxy_read_timeout 过短。
- 长连接未复用:上游未设 keepalive,或 proxy_http_version / Connection 未正确配置。
- 配置未生效或语法错误:先 nginx -t,再 reload;变更前备份并灰度发布。