要让后端日志记录真实客户端ip,必须启用http_realip_module并配置set_real_ip_from、real_ip_header和real_ip_recursive,使$remote_addr在日志中自动替换为真实ip。

要让后端日志记录真实客户端 IP 而非代理 IP,单靠 proxy_set_header X-Real-IP $remote_addr 是不够的——它只负责“发出去”,不改变 Nginx 自身日志里的 $remote_addr 值。真正实现真实审计,需在 Nginx 日志层完成 IP 替换,这依赖 http_realip_module 模块的解析能力。
确保 realip_module 已启用并正确识别可信来源
Nginx 默认不启用真实 IP 解析,必须确认模块已编译并配置可信代理段:
- 运行
nginx -V 2>&1 | grep http_realip,输出含--with-http_realip_module才表示可用 - 在
http或server块中添加可信代理网段(不能写0.0.0.0/0):set_real_ip_from 100.64.0.0/10;(阿里云 SLB)set_real_ip_from 172.16.0.0/12;(内网 LB 或 Kubernetes Service)set_real_ip_from 127.0.0.1;(本地反向代理场景) - 指定从哪个头提取 IP 链路:
real_ip_header X-Forwarded-For;(推荐)或real_ip_header X-Real-IP; - 开启递归解析:
real_ip_recursive on;,确保多层代理时能剔除所有可信节点,取最左不可信 IP
修改日志格式,让 $remote_addr 变成真实 IP
启用 realip 模块后,$remote_addr 在日志上下文中会自动变为解析出的真实客户端 IP——前提是配置已生效且请求来自可信代理:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 检查当前 log_format 是否使用
$remote_addr,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 无需额外变量,只要 realip 配置正确,该字段就代表真实访客 IP
- 若需同时保留原始连接 IP(调试用),可定义新变量:
$realip_remote_addr(Nginx 1.11.0+ 支持),但日常审计用$remote_addr即可
避免日志失真的关键细节
常见配置错误会导致日志仍记代理 IP,甚至引入安全风险:
- 不要把
set_real_ip_from写成公网段(如1.0.0.0/1),否则任意伪造X-Forwarded-For都会被信任 - 若前端有 CDN 或 WAF,必须把其回源 IP 段加入
set_real_ip_from,否则无法解析最外层真实 IP -
real_ip_header必须与上游实际透传的头一致;比如 CDN 用X-Forwarded-For,你就不能设为X-Real-IP - 日志中看到私有地址(如
10.x.x.x、192.168.x.x)说明 realip 未生效或可信段遗漏,需逐级排查代理链
后端应用日志也需对齐(可选但推荐)
如果后端服务(如 Java、Node.js)也写访问日志,建议让它读取同一个源头:
- 统一以
X-Forwarded-For最左非私有 IP 为准(比X-Real-IP更可靠,因后者可能被中间层覆盖) - 避免后端直接用
getRemoteAddr()或req.ip,这些返回的是 Nginx 连接 IP - 与 Nginx 的 realip 解析逻辑保持一致,可减少审计时 IP 不一致的困惑










