Nginx反向代理+upstream轮询是Java微服务在Linux上最常用、最轻量的负载均衡方案;通过http块定义upstream组并配置proxy_pass、proxy_set_header及proxy_next_upstream实现请求转发与故障重试。

Java 应用本身不直接参与 Nginx 的反向代理配置,Nginx 是独立于 Java 运行时的 Web 服务器/反向代理;它通过 HTTP 协议把外部请求转发给后端 Java 服务(如 Spring Boot 内嵌 Tomcat、Jetty 或独立部署的 Tomcat),而负载均衡则由 Nginx 对多个 Java 实例做分发。关键在于:Java 只需正常提供 HTTP 接口,Nginx 负责路由、转发和分发。
确认 Java 服务已监听正确地址与端口
Nginx 要能访问 Java 服务,该服务必须在 Linux 上可被 Nginx 进程访问(通常为同一台机器或内网可达)。常见情况:
- Spring Boot 默认启动在 localhost:8080,但 Nginx 无法访问
localhost(它代表 Nginx 自身),应改用127.0.0.1:8080或绑定到0.0.0.0:8080 - 检查 Java 进程是否真正监听:运行
netstat -tuln | grep :8080或ss -tuln | grep :8080 - 确保防火墙放行对应端口(如
sudo ufw allow 8080或sudo firewall-cmd --add-port=8080/tcp --permanent)
配置 Nginx 反向代理指向单个 Java 实例
编辑 Nginx 配置文件(如 /etc/nginx/conf.d/java-app.conf):
upstream java_backend {
server 127.0.0.1:8080;
}
<p>server {
listen 80;
server_name your-domain.com;</p><pre class="brush:php;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;
proxy_redirect off;
}}
注意:proxy_pass 后不要漏掉末尾斜杠(http://java_backend/ 与 http://java_backend 在路径拼接行为上不同);若 Java 应用有上下文路径(如 /api),可在 location 中指定并配合 proxy_pass 调整。
扩展为负载均衡:多实例 + 健康检查
当部署多个 Java 实例(例如分别在 8080、8081、8082 端口),可配置 upstream 实现轮询或加权分发:
upstream java_backend {
# 轮询(默认)
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
<pre class="brush:php;toolbar:false;"># 或启用简单健康检查(Nginx 开源版仅支持 passive 检查)
# health_check interval=3 fails=2 passes=2;}
若使用商业版 Nginx Plus,支持主动健康检查;
开源版常用做法是配合 keepalive 和 retry 配合应用层心跳(如 /actuator/health)
可选策略:
- ip_hash:保持客户端 IP 的会话粘性(适合无状态设计不完善的老应用)
- least_conn:分发到当前连接数最少的后端
-
weight:为不同性能的 Java 实例设置权重(如
server 127.0.0.1:8080 weight=3;)
验证与调试要点
配置完成后务必测试:
- 运行
sudo nginx -t检查语法 - 重载配置:
sudo nginx -s reload - 用
curl -I http://localhost/或浏览器访问域名,观察响应头中Server是否为nginx,且返回内容来自 Java 应用 - 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,常见错误如Connection refused表明 Java 服务未就绪或端口不对 - Java 日志中确认收到的
X-Forwarded-For等头信息是否完整,用于获取真实客户端 IP
不复杂但容易忽略:Java 应用里要信任 Nginx 传来的代理头(尤其涉及重定向、安全框架如 Spring Security 的 forwarded-for 处理),必要时配置 server.forward-headers-strategy=framework 或自定义 RemoteIpValve(Tomcat)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











