proxy_pass 指向 upstream 名称时必须提前在 http 块中定义,名称区分大小写且仅支持字母、数字、下划线和短横线;proxy_pass 后若接 upstream 名称则不可加路径(如 /v1),末尾斜杠决定是否剥离 location 前缀;需配合 proxy_set_header 传递真实客户端信息。

在 Nginx 中,proxy_pass 指令可以指向一个 upstream 块定义的服务器集群名称,这是实现负载均衡和后端服务解耦的标准做法。
upstream 块必须先定义,且名称要匹配
使用 proxy_pass 指向 upstream 名称时,该 upstream 必须已在当前作用域(通常是 http 块)中提前定义。Nginx 不支持跨文件隐式引用,也不允许在 server 块内定义后再在同级 location 中引用——必须是全局 http 级定义。
- 正确示例:
http {
upstream backend_cluster {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
<pre class="brush:php;toolbar:false;">server {
location /api/ {
proxy_pass http://backend_cluster; # ✅ 正确:名称完全匹配
}
}}
proxy_pass 后不能加 URI 路径(除非有意重写)
当 proxy_pass 指向 upstream 名称(如 http://backend_cluster)时,其后**不应再添加路径**(例如 http://backend_cluster/v1)。否则 Nginx 会将 location 匹配到的原始 URI 全部丢弃,强制重写为指定路径,导致后端接收不到原始路径信息。
- 错误写法(会截断原始路径):
location /api/ {
proxy_pass http://backend_cluster/v1; # ❌ /api/user → 后端收到 /v1/user,丢失语义
}- 正确做法(保持路径透传):
location /api/ {
proxy_pass http://backend_cluster/; # ✅ 注意末尾斜杠:/api/user → 后端收到 /user
}注意:末尾斜杠决定是否剥离 location 前缀。无斜杠则整个原始 URI(含 /api/)原样转发;有斜杠则剥离匹配部分。
upstream 名称区分大小写,且不能含特殊字符
upstream 名称是纯标识符,仅支持字母、数字、下划线和短横线(a-z、0-9、_、-),且严格区分大小写。例如 Backend_Cluster 和 backend_cluster 是两个不同集群。
- 合法名称:
api_v1、user-service、cache_backend - 非法名称:
my cluster(空格)、backend*(星号)、123start(不推荐以数字开头)
可配合 proxy_set_header 传递原始请求信息
由于流量经 Nginx 转发,后端默认无法获知真实客户端 IP 或原始 Host。需显式设置 header:
location /api/ {
proxy_pass http://backend_cluster/;
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;
}这些配置确保后端服务能正确识别来源、生成正确跳转链接或做访问控制。










