nginx需启用realip模块并配置set_real_ip_from、real_ip_header和real_ip_recursive,再用$realip_remote_addr替代$remote_addr写入日志,java应用应读取x-real-ip头获取真实ip。

Java 应用部署在 Nginx 后端(如通过 proxy_pass 转发到 Tomcat 或 Spring Boot 内嵌服务器)时,Nginx 默认日志中的 $remote_addr 记录的是 Java 服务所在机器与 Nginx 的连接地址(通常是 127.0.0.1 或内网 IP),而非用户真实 IP。要让日志准确体现客户端真实 IP,必须分两步:Nginx 正确识别并替换 IP 变量,再在日志格式中使用该变量。
确保 Nginx 启用 realip 模块并配置可信代理链
仅靠透传 X-Forwarded-For 头不够,Nginx 必须主动校验并更新内部 IP 变量:
- 确认模块已加载:
nginx -V 2>&1 | grep -o http_realip,有输出即支持 - 在
http或server块中声明可信来源(例如你的 CDN、SLB、前置 LB 或本机 Nginx 自身):set_real_ip_from 100.64.0.0/10; # 云厂商常见段<br>set_real_ip_from 192.168.0.0/16;<br>set_real_ip_from 127.0.0.1;
- 指定解析头:
real_ip_header X-Forwarded-For; - 开启递归解析:
real_ip_recursive on;——这才能从X-Forwarded-For: a,b,c中剔除所有可信 IP,留下最左的用户真实 IP
使用 $realip_remote_addr 替代 $remote_addr 定义日志格式
$remote_addr 不会因 realip 配置自动改变;启用 realip 后,应改用 $realip_remote_addr,它会在可信链匹配成功时返回真实 IP,失败时回退为原始 $remote_addr:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 在
http块中定义日志格式:log_format java_main '$realip_remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 在对应 server 或 location 中启用:
access_log /var/log/nginx/java-app-access.log java_main; - 避免直接用
$http_x_forwarded_for当主 IP 字段——它可能被伪造、含多个 IP、格式不稳,仅适合审计参考
Java 应用侧同步获取真实 IP(非日志但常需配套)
Nginx 日志用了真实 IP,Java 代码也应一致,不能依赖 request.getRemoteAddr()(它返回的是 Nginx 的出口 IP):
- 推荐统一读取 Nginx 设置的
X-Real-IP头(更简洁、单值):String ip = request.getHeader("X-Real-IP"); - 若只能用
X-Forwarded-For,需手动取第一个非私有、非可信段的 IP:String xff = request.getHeader("X-Forwarded-For");<br>if (xff != null && !xff.isEmpty()) {<br> ip = xff.split(",")[0].trim();<br>} - 务必配合白名单校验逻辑(如只接受来自
127.0.0.1或内网段的请求才信任该头),防止伪造
验证是否生效的快速方法
临时加一条调试日志格式,对比三者差异:
log_format debug '$http_x_forwarded_for ←→ $realip_remote_addr ←→ $remote_addr';- 发起一次请求(如 curl -H "X-Forwarded-For: 203.0.113.42" http://your.app/)
- 检查日志输出:若中间字段是
203.0.113.42,且左右字段不同,说明 realip 已正确工作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










