nginx需在listen指令中启用proxy_protocol并配合realip模块,通过set_real_ip_from指定可信lb网段、real_ip_header proxy_protocol,使$remote_addr准确还原客户端真实ip。

要让后端 RealServer(如 Nginx)通过 PROXY 协议准确还原客户端真实 IP,关键不是“解析头部”,而是启用 TCP 层协议解析能力——PROXY 协议本身是二进制/文本格式的连接前导数据,位于 HTTP 请求之前,必须在连接建立初期就被识别和处理。
确认负载均衡器已启用 PROXY Protocol
这是前提。四层负载均衡(如阿里云 TCP 型 SLB、腾讯云 CLB 四层、HAProxy 的 mode tcp、LVS + keepalived 等)必须开启 PROXY Protocol v1(文本)或 v2(二进制)。常见配置示例:
- HAProxy:
option forwardfor不起作用,需在 backend 中加send-proxy-v2或send-proxy - 阿里云 SLB:控制台开启“PROXY 协议支持”,仅对 TCP/UDP 监听生效
- 确保后端 RealServer 的监听端口只接收来自该 LB 的连接,不暴露给公网直连
Nginx RealServer 启用 proxy_protocol 支持
后端 Nginx 必须在 listen 指令中显式声明启用 PROXY 协议,并配合 realip 模块校验来源可信性:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在 server 或 http 块中配置:
listen 80 proxy_protocol;(端口需与 LB 转发一致) - 添加 realip 模块指令:
set_real_ip_from 100.64.0.0/10;(填你 LB 实际出口网段,如腾讯云用100.125.0.0/16,自建内网 LB 填对应 CIDR) - 指定解析源:
real_ip_header proxy_protocol; - 无需设置
real_ip_recursive—— PROXY 协议只携带一个原始客户端 IP,不存在多跳链路
验证与日志一致性
配置生效后,Nginx 会自动将 $remote_addr 替换为 PROXY 协议中声明的客户端 IP,所有模块(access_log、limit_req、geo、auth_basic 等)均可直接使用:
- 检查日志格式是否含
$remote_addr,例如:log_format main '$remote_addr - ...'; - 用 curl 测试时,LB 会透传真实 IP;若本地直连该端口(绕过 LB),请求会被拒绝或 $remote_addr 保持为连接发起方 IP(因不满足 set_real_ip_from)
- 避免同时开启 X-Forwarded-For 和 PROXY Protocol 解析,二者混用易导致冲突或误判
其他后端服务适配要点
若 RealServer 是非 Nginx 服务(如 Node.js、Golang、Java),需依赖运行时或反向代理层支持:
- Node.js(Express):需前置 Nginx 或使用
req.connection.remoteAddress(仅当监听 socket 启用proxy: true) - Golang net/http:标准库不原生支持,需用
github.com/armon/go-proxyproto包封装 listener - Java(Spring Boot):若部署在 Tomcat,需配置
RemoteIpValve并设protocolHeader="X-Forwarded-Proto"——但注意:PROXY Protocol ≠ HTTP Header,Tomcat 原生不支持,必须由前置 Nginx 解析后转为 XFF 或 X-Real-IP










