nginx 多级代理需每层显式透传头与修正ip:设proxy_set_header x-real-ip $remote_addr等,配合set_real_ip_from声明可信上游,并启用real_ip_recursive;proxy_pass末尾必须加/避免路径重复;逐层调优timeout与容错机制。

Nginx 实现 HTTP 多层级代理转发,关键不是堆叠 proxy_pass,而是让每一层都明确知道自己“该传什么、该信谁”,否则真实 IP 丢失、重定向错乱、X-Forwarded-For 累加、502/504 频发等问题会集中爆发。
每层必须显式配置头透传与 IP 修正
多级代理链(比如 Client → CDN → Nginx A → Nginx B → Backend)中,中间每台 Nginx 都要主动处理请求头和客户端地址:
- 使用
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;向下透传 - 必须配合
set_real_ip_from指令声明可信上游(如上一级 Nginx 的 IP),否则$remote_addr仍是上一跳的 IP,而非真实客户端 - 后端服务应读取
$realip_remote_addr(经 real_ip 模块修正后的变量),而不是直接信任X-Forwarded-For的第一个值
路径转发需统一斜杠规则,避免重复拼接
多层转发时路径易出错,尤其当某一层漏掉尾部斜杠:
- 所有
proxy_pass目标地址末尾必须加/(例如@#@#@#@#@#@#@#@#@#@0) - 这样 Nginx 才会自动剥离匹配的 location 前缀(如
/api/v2/),只转发剩余路径(如/user/list) - 若某层写成
proxy_pass http://...;(无尾斜杠),原始路径会被完整带上,导致后端收到/api/v2/api/v2/user/list这类双倍前缀而 404
超时与容错需逐层调优
长链路下,任意一层超时都会引发级联失败:
- 设置合理的
proxy_read_timeout(建议 ≥ 后端最长响应时间) - 开启
proxy_next_upstream error timeout http_502;,单点故障时可尝试同组其他节点 - 若某层是负载均衡器,还需配
upstream健康检查(max_fails+fail_timeout)
后端识别逻辑要依赖修正后的 IP,而非原始头
很多应用直接解析 X-Forwarded-For 取第一个 IP,这在多级代理下极不可靠(可能被伪造或累加)。正确做法是:
- 在 Nginx 中启用
real_ip_recursive on;并按实际链路顺序配置set_real_ip_from - 确保
real_ip_header X-Forwarded-For;或X-Real-IP(依透传策略定) - 后端代码读取框架提供的「真实客户端 IP」字段(如 Spring 的
HttpServletRequest.getRemoteAddr()在启用 real_ip 模块后已修正)
不复杂但容易忽略











