Nginx对接Tomcat集群实现负载均衡,核心是配置upstream反向代理、解决Session一致性(ip_hash或Redis共享)、调优Tomcat连接参数与JVM,无需修改Java代码。

用 Nginx 对接 Tomcat 集群实现 Java 应用的负载均衡,核心是让 Nginx 作为反向代理,把 HTTP 请求按策略分发到多个 Tomcat 实例,同时保障会话连续性与服务高可用。不需要改 Java 代码,只需配置 Nginx 和调优 Tomcat 即可落地。
一、基础架构与前提准备
确保以下条件已就绪:
- 一台运行 Nginx 的服务器(建议 CentOS/Ubuntu,Nginx ≥1.18)
- 至少两台 Tomcat 服务器(同版本,如 Tomcat 9.0.41;JDK 版本一致)
- 所有 Tomcat 节点部署相同的 WAR 包,且应用能独立运行(不依赖本地文件或单机 Session 存储)
- Nginx 与各 Tomcat 之间网络互通,能通过内网 IP 访问 8080 端口(关闭防火墙或放行规则)
- Tomcat 的
conf/server.xml中 HTTP 连接器启用,AJP 连接器可注释掉(除非明确要用 AJP)
二、Nginx 负载均衡核心配置
编辑 /etc/nginx/conf.d/tomcat.conf(或主配置中 http 块内),添加如下内容:
示例:加权轮询 + 故障自动剔除
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
upstream tomcat_cluster {
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 backup;
}
<p>server {
listen 80;
server_name app.example.com;</p><pre class='brush:php;toolbar:false;'>location / {
proxy_pass http://tomcat_cluster;
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_connect_timeout 10;
proxy_send_timeout 30;
proxy_read_timeout 30;
}}
关键说明:
- weight:按性能分配流量比例(如 3:2 表示第一台处理 60% 请求)
- backup:仅当其他节点全不可用时才启用,适合灾备节点
- max_fails/fail_timeout:Nginx 主动探测失败后,临时下线该节点,避免雪崩
- X-Forwarded-* 头部:确保 Tomcat 日志和应用能拿到真实客户端 IP 和协议类型
三、解决 Session 一致性问题
Java Web 应用默认 Session 存在单个 Tomcat 内存中,请求跳转会导致登录失效。有两类主流方案:
-
Session 粘滞(推荐初上线使用):在 upstream 块中加入
ip_hash;,同一 IP 始终打到同一台 Tomcat。
优点:零改造、低延迟;缺点:某节点宕机时该 IP 用户会话丢失 -
共享 Session(生产环境首选):将 Session 存入 Redis 或数据库。
需在应用中引入spring-session-data-redis(Spring Boot)或配置 Tomcat 的RedissonSessionManager,Nginx 不需额外配置
四、Tomcat 侧必要调优
避免连接堆积或响应延迟拖垮整体性能:
- 调整
conf/server.xml中 Connector 参数:<Connector port="8080" protocol="HTTP/1.1"<br> maxThreads="500" minSpareThreads="50"<br> acceptCount="100" connectionTimeout="20000"<br> enableLookups="false" />
- JVM 启动参数建议(
bin/setenv.sh):export JAVA_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=256m" - 关闭不必要的 Valve(如 AccessLogValve 若非调试可关)
配置完成后执行 sudo nginx -t && sudo systemctl reload nginx 生效。访问域名即可看到请求被自动分发,可通过 Tomcat 日志或 Nginx access.log 验证分发效果。不复杂但容易忽略细节。

















