proxy_pass末尾斜杠决定路径处理方式:无斜杠则原样透传(如/api/user→/api/user),有斜杠则剥离location前缀(如/api/user→/user),带路径则替换前缀(如/api/user→/v2/user);必须配置host、x-real-ip等header,否则后端无法获取真实请求信息。

proxy_pass 是 Nginx 反向代理的“心脏”,但写错一行,就可能引发 404、502、路径错乱、IP 丢失、WebSocket 断连等线上问题。真正影响稳定性的,往往不是功能有没有,而是细节对不对。
斜杠决定路径命运:带不带 / 完全两种行为
这是出错率最高的地方,90% 的路径类故障都源于此。
-
proxy_pass http://127.0.0.1:8080;(无尾部 /)→ 原样透传:请求
/api/user转发为http://127.0.0.1:8080/api/user -
proxy_pass http://127.0.0.1:8080/;(有尾部 /)→ 剥离前缀:请求
/api/user转发为http://127.0.0.1:8080/user -
proxy_pass http://127.0.0.1:8080/v2/;→ 替换前缀:请求
/api/user转发为http://127.0.0.1:8080/v2/user
判断依据很简单:proxy_pass 后面 URL 中只要包含任何路径(哪怕只是 /),就算“带 URI”,触发替换逻辑;否则就是“不带 URI”,执行追加。
必须配套的 header 设置,否则后端会“失明”
Nginx 默认会覆盖或清空关键请求头,不显式设置,后端就拿不到真实信息。
- Host 头缺失 → 后端返回 400,或静态资源 404(尤其依赖 Host 做多租户或 CDN 回源)
-
X-Real-IP / X-Forwarded-For 缺失 → 日志全是
127.0.0.1,无法溯源真实用户 - X-Forwarded-Proto 缺失 → HTTPS 站点跳转成 HTTP,混合内容报错
在 location 块中固定加上这四行:
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;
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
正则 location + proxy_pass 的变量陷阱
用 location ~ ^/download/(.*) 这类正则时,直接拼接 $1 风险极高:
- 若
$1含特殊字符(如空格、中文、%编码),Nginx 可能解析失败或二次编码 - 查询参数(
?a=1&b=2)不会自动传递
更安全的写法是使用命名捕获组,并显式拼接参数:
location ~ ^/download/(?
proxy_pass http://cdn/$path?$args;
}
这样既保留原始编码,又确保查询参数完整透传。
上游稳定性增强:超时、重试与健康检查
仅靠 proxy_pass 不足以应对生产环境波动。
- 设好基础超时:
proxy_connect_timeout 5s;、proxy_send_timeout 30s;、proxy_read_timeout 30s; - 启用自动容错:
proxy_next_upstream error timeout http_502 http_503; - 搭配 upstream 使用权重和备份节点,支持灰度与灾备:
upstream backend {
server 10.0.0.1 weight=5;
server 10.0.0.2 weight=1;
server 10.0.0.3 backup;
}










