CentOS 下 Tomcat 负载均衡实操指南
一、方案总览与准备
firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload。二、方案一 Nginx 作为负载均衡器
sudo yum install -y epel-release && sudo yum install -y nginx。/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/tomcat.conf:http {
upstream tomcat_servers {
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 可选:权重
# server 192.168.1.11:8080 weight=3;
# server 192.168.1.12:8080 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://tomcat_servers;
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;
}
}
}
sudo systemctl enable --now nginx,访问前端 IP/域名,刷新应能在两台 Tomcat 之间轮询。ip_hash;,同一客户端将固定到同一后端。max_fails=3 fail_timeout=30s;,在故障节点超过阈值后自动摘除一段时间。三、方案二 Apache HTTP Server 作为负载均衡器
/etc/httpd/conf/httpd.conf 或相应子配置中确保加载:mod_proxy、mod_proxy_http、mod_proxy_balancer。<Proxy balancer://tcsrvs>
BalancerMember http://192.168.1.11:8080 route=node1
BalancerMember http://192.168.1.12:8080 route=node2
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName your.domain
ProxyPreserveHost On
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>
<Proxy balancer://tcsrvs> 上增加 ProxySet stickysession=JSESSIONID,并为成员设置 route=nodeX;Tomcat 端需设置 jvmRoute 与之对应(见第四部分)。sudo systemctl enable --now httpd,访问测试。四、会话保持与会话复制
ip_hash;。stickysession=JSESSIONID 并为 BalancerMember 设置 route=nodeX。conf/server.xml 的 <Engine> 上设置唯一 jvmRoute(如 jvmRoute="node1"、jvmRoute="node2"),与负载均衡器的 route 保持一致。conf/server.xml 中启用集群(在 <Engine> 或同级位置加入):<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.jsp|.*\.do"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
META-INF/context.xml 或全局 conf/context.xml 中使用会话管理器(示例为 DeltaManager):<Context>
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
</Context>
五、验证与运维要点
webapps/ROOT/index.jsp 写入不同标识(如 “Tomcat-A/B”),反复访问前端地址,观察页面在实例间切换;使用 curl -I 或浏览器开发者工具查看响应头与后端节点。/var/log/nginx/access.log、/var/log/nginx/error.log/var/log/httpd/access_log、/var/log/httpd/error_log$CATALINA_HOME/logs/catalina.out、localhost_access_log.*.txtmax_fails/fail_timeout;如需主动健康检查,可结合 ngx_http_healthcheck_module 或外部探活脚本。mod_proxy_balancer 的 status 页面查看与维护后端状态。