单级代理下,proxy_set_header X-Real-IP $remote_addr可精准传递真实IP,前提是Nginx为最外层入口;需确认无CDN/WAF/负载均衡,且后端显式读取该头并校验来源。

单级代理下,proxy_set_header X-Real-IP 能精准传递真实 IP,前提是 Nginx 是直接面向客户端的唯一入口——没有 CDN、WAF 或负载均衡器在它前面。此时 $remote_addr 就是用户真实 IP,可放心透传。
确认 Nginx 处于最外层位置
这是最关键的前置判断。如果请求路径是「用户 → Nginx → 后端」,且 Nginx 绑定公网 IP 或直连用户(如内网测试、小规模部署),那么:
-
$remote_addr值就是客户端真实 IP,无需额外解析 - 不需要配置
set_real_ip_from和real_ip_header - 若误加这些指令,反而可能因无可信源导致
$remote_addr变为空或异常
正确配置 proxy_set_header X-Real-IP
在含 proxy_pass 的 location 块中,把 X-Real-IP 设为 $remote_addr,且必须放在 proxy_pass 行之前:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_set_header X-Real-IP $remote_addr;—— 简洁明确,后端可直接读取 - 可同时加
proxy_set_header X-Forwarded-For $remote_addr;,保持兼容性 - 避免使用
$proxy_add_x_forwarded_for,因为上游无该头,它等价于$remote_addr,但语义上易引发误解
后端必须主动读取该 Header
Web 框架默认不信任请求头中的 IP,仍会返回 Nginx 的连接地址(如 127.0.0.1)。需代码层面显式提取:
- Node.js(Express):
req.headers['x-real-ip'] || req.ip(需提前设app.set('trust proxy', true)) - Python(Flask):
request.headers.get('X-Real-IP') - PHP:
$_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] - Java(Spring):
request.getHeader("X-Real-IP")
验证是否生效
快速检查链路是否按预期工作:
- 在 Nginx 配置中临时添加:
add_header X-Debug-IP $remote_addr;,用curl -I查看响应头值是否为你的公网 IP - 后端打印
X-Real-IP请求头,确认不是内网地址、127.0.0.1或空值 - 用本地
curl -H "X-Real-IP: 1.1.1.1" http://your-domain/测试:若后端返回1.1.1.1,说明头未校验,存在伪造风险;正常应忽略该伪造值,只认真实 TCP 连接来源

















