proxy_pass末尾斜杠决定路径处理方式:带斜杠则替换前缀(如location /api/ + proxy_pass http://b/ → 后端收/users),不带则原样拼接(→ 收/api/users);正则匹配时必须显式指定URI;需配置proxy_set_header传递Host、X-Real-IP等关键头。

Nginx 使用 proxy_pass 实现反向代理非常常见,核心是把客户端请求转发到后端服务,同时隐藏真实地址、统一入口、支持负载均衡等。关键不在“能不能转”,而在于路径处理、头信息、超时等细节是否配置得当。
基础语法与路径映射规则
proxy_pass 后面跟的 URL 决定了如何拼接路径,这是最容易出错的地方:
- 如果
location以/api/结尾,且proxy_pass也以/api/结尾(末尾带斜杠),Nginx 会去掉匹配前缀再拼接。例如:location /api/ { proxy_pass http://127.0.0.1:8000/api/; }
请求/api/users→ 转发到http://127.0.0.1:8000/api/users - 如果
proxy_pass末尾不带斜杠,则整个原始 URI(包括/api/)都会被原样追加:location /api/ { proxy_pass http://127.0.0.1:8000; }
请求/api/users→ 转发到http://127.0.0.1:8000/api/users - 不写
/api/后缀(即用精确匹配或正则),需配合rewrite控制路径重写,但一般建议优先用带斜杠的方式保持语义清晰。
必须设置的关键代理头信息
后端服务常依赖 Host、X-Real-IP 等字段做日志、鉴权或生成绝对链接。默认 Nginx 不传递这些,需显式配置:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_set_header Host $host;:保留原始 Host,避免后端收到127.0.0.1:8000这类无效值 -
proxy_set_header X-Real-IP $remote_addr;:让后端拿到真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:支持多层代理链路追踪 -
proxy_set_header X-Forwarded-Proto $scheme;:告知后端当前是http还是https,对生成跳转链接很重要
超时与连接稳定性控制
后端响应慢或网络抖动时,Nginx 默认等待时间太短(60秒),容易返回 504;长连接未复用还会增加开销。建议补充:
-
proxy_connect_timeout 10s;:与后端建连最长等待时间 -
proxy_send_timeout 30s;:发送请求体给后端的最大间隔(非总耗时) -
proxy_read_timeout 30s;:等待后端响应头/数据的最大间隔 -
proxy_http_version 1.1;和proxy_set_header Connection '';:启用 HTTP/1.1 长连接,提升并发性能
常见问题快速排查方向
代理后出现 502、404 或路径错乱,优先检查:
- 后端服务是否真实运行并监听在指定 IP:Port?可用
curl -v http://127.0.0.1:8000/health直连验证 -
proxy_pass地址是否写错协议(如漏掉http://)?漏了会当成域名解析,导致 502 - 路径映射是否因斜杠缺失/多余导致后端收不到预期路径?开启
error_log /var/log/nginx/error.log debug;查看 rewrite 和 proxy 日志 - SELinux 或防火墙是否拦截了 Nginx 到后端的 outbound 连接?

















