Nginx 中 proxy_pass 转发需配合 upstream 实现负载均衡、健康检查与容错;upstream 定义服务器组并支持 weight、max_fails/fail_timeout、backup 等参数;location 中通过 proxy_pass 引用 upstream 名称,末尾斜杠决定路径重写行为;必须设置 proxy_set_header 传递 Host、X-Real-IP、X-Forwarded-For 等头部以确保后端获取真实请求信息。

在 Nginx 中用 proxy_pass 转发请求到后端集群,核心是配合 upstream 块定义服务器组,并在 location 中调用。关键不是只写 proxy_pass http://xxx,而是让转发具备负载均衡、健康检查和容错能力。
定义 upstream 集群(支持负载均衡)
在 http 块中声明一个命名的服务器组,Nginx 会自动轮询或按策略分发请求:
upstream backend_cluster {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 max_fails=2 fail_timeout=10s;
server 192.168.1.12:8080 backup;
}- weight:指定权重,数值越大分配越多请求
- max_fails / fail_timeout:连续失败 2 次后,10 秒内不将新请求发给该节点
- backup:仅当其他节点全部不可用时才启用
在 location 中使用 proxy_pass 转发
把请求代理到上面定义的 upstream 名称,注意末尾斜杠的语义差异:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location /api/ {
proxy_pass http://backend_cluster; # 不带末尾 /,保留 /api/ 路径
}
location /app/ {
proxy_pass http://backend_cluster/; # 带末尾 /,会重写路径,/app/foo → /foo
}}
- 用
http://backend_cluster(无尾部斜杠)→ 后端收到完整原始路径,如/api/users - 用
http://backend_cluster/(有尾部斜杠)→ 自动剥离/app/,后端收到的是/users
补充必要代理头,避免后端取不到真实信息
默认情况下,后端看到的 IP 是 Nginx 的,Host 是 upstream 名字。需显式设置关键头字段:
location /api/ {
proxy_pass http://backend_cluster;
<pre class="brush:php;toolbar:false;">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;}
- X-Real-IP:单层代理时可用,表示客户端真实 IP
-
X-Forwarded-For:多层代理时保留原始 IP 链(如
client, nginx1, nginx2) - 后端应用需主动读取这些 header 才能获取真实用户信息
可选:启用主动健康检查(需商业版或 OpenResty)
开源 Nginx 默认只做被动检测(靠 max_fails),若需定期探活,可考虑:
- 使用 第三方 check 模块 编译安装
- 升级到 Nginx Plus(官方商业版),支持
health_check指令 - 或在应用层加就绪探针(如
/healthz),配合服务发现工具调度


















