proxy_pass末尾斜杠决定路径重写行为:带/则截断location前缀,不带/则保留完整路径;需配合upstream实现负载均衡,并透传x-real-ip、host等头信息以保障日志与鉴权准确。

在分布式环境中,proxy_pass 不只是简单转发请求,它直接关系到服务路由准确性、路径语义一致性以及后端服务的可维护性。配置不当容易导致 404、重复路径、静态资源加载失败或 session 失效等问题。
proxy_pass 的末尾斜杠决定路径重写行为
这是最易出错也最关键的一点:斜杠有无直接控制 URI 是否被截断。
- 若
proxy_pass http://backend/;(结尾带/),Nginx 会剥离 location 匹配前缀,再拼接到目标地址。例如:location /api/ { proxy_pass http://192.168.1.10:8080/; }
请求/api/users→ 转发为http://192.168.1.10:8080/users - 若
proxy_pass http://backend;(结尾无/),Nginx 会原样保留完整匹配路径。例如:location /api/ { proxy_pass http://192.168.1.10:8080; }
请求/api/users→ 转发为http://192.168.1.10:8080/api/users
与 upstream 配合实现多实例负载均衡
分布式系统通常部署多个相同服务实例,需用 upstream 定义服务池,再由 proxy_pass 引用。
- 必须将
upstream块定义在http级,不能放在server或location内 - 推荐显式指定负载策略,如
ip_hash解决登录态粘连,或weight适配不同规格机器 - 示例配置:
ip_hash;
server 10.0.1.100:8081;
server 10.0.1.101:8081;
}
然后在 location 中使用:location /order/ { proxy_pass http://order_service/; }
透传客户端真实信息,避免日志和鉴权失真
分布式链路中,后端服务常依赖真实 IP、Host 和协议做限流、黑白名单或 HTTPS 重定向判断。
- 必须设置
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for; - 建议显式传递
Host头:proxy_set_header Host $host:$server_port;,防止后端误读代理主机名 - 若前端强制 HTTPS,还需加:
proxy_set_header X-Forwarded-Proto $scheme;
避免跨域与路径冲突的常见实践
前后端分离架构下,前端常通过 Nginx 统一代理 API,需注意静态资源与接口路径隔离。
- 不要让
location /全局 proxy_pass,应按路径精确划分,例如:location /static/ { root /data/web/; }location /api/ { proxy_pass http://gateway/; } - 若后端是 Spring Boot 或类似框架,默认 context-path 为空,务必确认其是否接受根路径;否则需在
proxy_pass后补全上下文,如http://svc:8080/myapp/ - 开发环境可用 rewrite 配合 proxy_pass 做临时适配,但生产环境应统一后端路径约定,减少中间转换











