nginx反向代理java应用需正确配置upstream与location,并设置x-forwarded-*头;java侧须启用forwarded headers支持,docker部署时注意网络可达性,避免502及路径重复问题。

Java 应用本身不处理 Nginx 反向代理配置,Nginx 是独立于 Java 的 Web 服务器/代理层;所有配置都在 nginx.conf 或其包含的文件中完成,Java 侧只需确保能正确识别真实客户端地址和协议。
反向代理基本配置:upstream + location
核心是把请求从 Nginx 转发到后端 Java Web 服务(如 Tomcat、Spring Boot 内嵌容器),常见部署方式是 Java 服务监听 localhost:8080,Nginx 监听 80 或 443 并代理过去。
典型配置片段:
upstream java_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name example.com;
<pre class='brush:java;toolbar:false;'>location / {
proxy_pass http://java_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}}
立即学习“Java免费学习笔记(深入)”;
-
proxy_pass后必须带协议(http://),否则 Nginx 会报invalid URL prefix - 若 Java 应用依赖
request.getScheme()或request.isSecure()(如 Spring Security 重定向逻辑),X-Forwarded-Proto必须设置,否则可能跳转到http而非https -
proxy_set_header Host $host保证后端收到原始 Host,避免因 Host 被覆盖导致静态资源 404 或 Cookie 域名错误
Spring Boot 场景下必须启用 Forwarded Headers 支持
Spring Boot 2.2+ 默认忽略 X-Forwarded-* 头,需显式启用,否则 ServletRequest.getRemoteAddr() 仍是 127.0.0.1,且 HTTPS 检测失效。
在 application.properties 中添加:
server.forward-headers-strategy=framework # 或更细粒度控制(Spring Boot 2.6+): # server.tomcat.remoteip.remote-ip-header=x-forwarded-for # server.tomcat.remoteip.protocol-header=x-forwarded-proto
- 使用
framework策略时,Spring Boot 会自动信任X-Forwarded-For和X-Forwarded-Proto,但前提是 Nginx 在同一台机器或可信内网——不可在公网直连 Nginx 时盲目开启 - 若 Java 服务部署在 Docker 容器中,且 Nginx 在宿主机,
127.0.0.1对容器不可达,应改用宿主机 IP 或 Docker 网络别名,并确认容器网络策略允许该通信
常见错误:502 Bad Gateway 和路径错位
502 Bad Gateway 多数是因为 Nginx 根本连不上后端 Java 进程,而非 Java 报错。
- 检查 Java 进程是否真在监听:运行
netstat -tuln | grep :8080(Linux)或lsof -i :8080,确认是LISTEN状态且绑定在0.0.0.0或127.0.0.1(不是127.0.0.1:8080时,Docker 容器外无法访问) -
location /api/末尾带斜杠,而proxy_pass http://backend/api/也带斜杠,会导致双斜杠(如//api/users);推荐统一写法:location /api/ { proxy_pass http://backend/; },让 Nginx 自动重写路径 - Nginx worker 进程权限不足(如以
nobody用户运行)无法读取 SSL 证书,导致 HTTPS 配置失败,表现为 502 或连接被拒绝
真正麻烦的从来不是配几行 proxy_pass,而是当 Nginx 和 Java 分属不同网络平面(比如云厂商 SLB → Nginx → K8s Ingress → Pod)时,X-Forwarded-For 可能被多次追加,Real-IP 解析逻辑必须配合 set_real_ip_from 显式声明可信上游,否则直接拿第一个 IP 会误判为攻击源。










