Nginx负载均衡需三要素协同:upstream必须定义在http块内、proxy_pass须以http://name形式精确引用、且需透传Host/X-Real-IP等关键请求头,缺一将导致502或轮询失效。

在 Nginx 中,proxy_pass 和 upstream 配合使用是最常用、最标准的负载均衡实现方式。核心思路是:先用 upstream 块定义一组后端服务器,再在 location 或其他上下文中用 proxy_pass 指向该 upstream 名称,Nginx 自动按策略分发请求。
1. 定义 upstream 块(放在 http 块内)
upstream 必须定义在 http 级别(不能放在 server 或 location 里),它声明了后端服务池和调度策略:
http {
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 其他配置...
}默认使用轮询(round-robin)策略,每台服务器等权重接收请求。你还可以显式指定权重、健康检查或备用节点:
-
加权轮询:添加
weight=2让某台机器承担双倍流量 -
容错与备份:加
backup标记为备用节点,仅当其他全不可用时启用;加max_fails=3 fail_timeout=30s启用主动健康检查 -
最少连接:用
least_conn;指令让请求优先发给当前连接数最少的后端
2. 在 location 中用 proxy_pass 引用 upstream
只需把 proxy_pass 的目标设为 http://<upstream_name>(注意协议前缀不能省略):
server {
listen 80;
server_name example.com;
<pre class='brush:php;toolbar:false;'>location /api/ {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}}
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
关键细节:
- 如果
proxy_pass后带 URI(如http://backend_servers/),Nginx 会重写路径(去掉匹配的/api/);若不带斜杠(如上例),则原样透传,需确保后端能处理带前缀的路径 -
proxy_set_header是必须补全的,否则后端可能收不到真实客户端 IP 或 Host 信息
3. 可选:启用 session 保持(sticky 会话)
某些业务要求同一用户始终落在同一台后端(如未共享 session 的老系统),可用 ip_hash 或第三方模块:
- ip_hash:基于客户端 IP 哈希,简单但不抗代理(所有用户走同一个出口 IP 就会打到同一台)
- hash $cookie_jsessionid;:按 JSESSIONID Cookie 哈希,适合 Java 应用
- 第三方 sticky 模块(如 nginx-sticky-module):支持更灵活的粘性策略,需自行编译
4. 验证与调试小技巧
部署后建议快速验证是否生效:
- 用
curl -I http://your-domain/api/test多次执行,观察响应头中的X-Upstream-Addr(可配合add_header X-Upstream-Addr $upstream_addr;添加) - 临时在 upstream 中加入
down或max_fails=0模拟故障,确认流量是否自动切走 - 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,留意 “no live upstreams” 或 “connection refused” 类报错
不复杂但容易忽略:upstream 名称不能含下划线(_),否则 Nginx 启动会报错;proxy_pass 的 URL 协议必须明确,不能只写 backend_servers。

















