Nginx upstream默认轮询,加weight实现加权分发;Java需无状态、透传真实IP、启用健康检查与日志验证。配置示例:upstream java_backend { server 192.168.1.10:8080 weight=3; server 192.168.1.11:8080 weight=2; server 192.168.1.12:8080 weight=1; }

直接在 Nginx 的 upstream 块里写服务器地址就行,轮询是默认行为;加权重就加 weight=数字。Java 应用本身不用改代码,只要确保后端服务无状态、接口可被反向代理访问即可。
轮询策略:最简配置,适合均质 Java 服务
适用于多台 Tomcat、Spring Boot(内置 Tomcat)或 Jetty 实例性能相近、处理能力基本一致的场景。Nginx 按顺序把请求轮流发给每台后端,自动跳过不可达节点。
- 基础写法(不写任何关键字就是轮询):
upstream java_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
} - 建议加上健康检查,避免请求打到已宕机的 Java 进程上:
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
表示连续失败 3 次后,30 秒内不再转发请求过去。 - 配合
proxy_set_header把真实 IP 透传给 Java 应用,方便日志追踪和限流:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
加权轮询:适配不同规格的 Java 服务器
当 Java 实例部署在不同配置的机器上(比如 8C16G 和 4C8G),用 weight 控制流量比例更合理。权重只支持整数,最小为 1,不填默认是 1。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 配置示例(按 CPU 能力粗略设权):
upstream java_backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
对应流量分配约为 50% / 33% / 17%。 - 注意:
weight和ip_hash不能共存,否则 Nginx 启动会报错。 - 权重变更需 reload 配置生效(
nginx -s reload),原生 Nginx 不支持运行时动态调权;如需实时调整,得引入第三方模块或外部调度系统。
Java 侧注意事项:别让负载均衡失效
轮询和加权轮询都要求后端是无状态的。如果 Java 应用用了本地 Session、静态变量缓存用户数据,或依赖单机定时任务,就会出问题。
立即学习“Java免费学习笔记(深入)”;
- Session 统一存 Redis 或数据库,禁用 Tomcat 默认的内存 Session。
- 避免在代码里写
System.setProperty或全局 static map 存用户上下文。 - 检查 Spring Boot 的 Actuator 端点是否暴露,方便你用
/actuator/health配合 Nginx 健康检查做联动。 - Java 应用启动后,先 curl 测试各实例是否能单独响应,再接入 Nginx,排除应用层故障干扰。
验证方式:看日志比看文档更准
不要只信配置语法对,要确认请求真按预期分发了。
- 在每台 Java 服务器的 access 日志里加 IP 和时间戳字段,连续发起 10–20 次请求,观察分发顺序。
- 用
ab -n 100 -c 10 http://nginx-ip/或wrk做小压力测试,对比各后端请求数差异。 - 如果发现某台始终没流量,检查防火墙、端口连通性、Nginx error 日志,以及 Java 进程是否真的监听在
0.0.0.0:8080而非127.0.0.1:8080。

















