Nginx需配置proxy_set_header传递真实IP,核心是设置X-Real-IP和X-Forwarded-For;若经CDN等多层代理,须配合real_ip模块信任可信IP段并指定真实IP头,后端应优先读X-Real-IP或校验X-Forwarded-For最左非私有IP。

在 Nginx 中使用 proxy_set_header 转发客户端真实 IP,核心是正确设置 X-Real-IP 和 X-Forwarded-For 这两个请求头,让后端服务(如应用服务器)能获取到用户原始 IP,而不是反向代理(Nginx)自身的 IP。
为什么要转发真实 IP?
当 Nginx 作为反向代理时,后端服务收到的请求来源 IP 是 Nginx 的内网地址(比如 127.0.0.1 或 10.x.x.x),丢失了用户真实 IP。日志记录、访问限制、地域判断等功能都会出错。因此需通过 HTTP 头显式传递真实 IP。
关键配置:设置 X-Real-IP 和 X-Forwarded-For
在 location 或 server 块中添加以下指令:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
说明:
-
$remote_addr是与 Nginx 建立 TCP 连接的客户端 IP。若 Nginx 直连用户,它就是真实 IP;若前面还有 CDN 或负载均衡,则需结合real_ip模块信任并提取前置 IP。 -
$proxy_add_x_forwarded_for是 Nginx 内置变量:它会在原有X-Forwarded-For值(如有)末尾追加$remote_addr,用逗号分隔。这样能保留完整转发链路,避免覆盖。
处理多层代理(如 CDN 或云 WAF)
如果请求路径是「用户 → CDN → Nginx → 后端」,仅靠 $remote_addr 会得到 CDN 的出口 IP。此时需:
- 确认 CDN 在请求中设置了可信头(如
X-Forwarded-For或X-Real-IP) - 在 Nginx 中启用
real_ip模块,声明可信代理段:
set_real_ip_from 192.0.2.0/24;(替换为 CDN 提供的 IP 段)
real_ip_header X-Forwarded-For;
real_ip_recursive on; - 之后再用
$remote_addr就能拿到用户真实 IP,proxy_set_header配置保持不变。
后端服务如何读取?
不同语言/框架读取方式不同,但逻辑一致:
- 优先读
X-Real-IP(单个最可信 IP) - 或解析
X-Forwarded-For最左边非私有 IP(注意校验和截断,防止伪造) - 务必配置后端只信任来自 Nginx 的请求头,禁用外部直接提交这些头


















