在Linux环境下使用Nginx作为反向代理配置Tomcat集群的基本架构如下:
客户端请求 → Nginx (负载均衡) → [Tomcat实例1, Tomcat实例2, ...]
假设您已经安装了多个Tomcat实例,监听不同端口(例如8080和8081)。
编辑Nginx配置文件(通常在/etc/nginx/nginx.conf
或/etc/nginx/conf.d/default.conf
):
http {
upstream tomcat_cluster {
# 配置负载均衡策略
# least_conn; # 最少连接策略
# ip_hash; # 基于IP的会话保持
# 添加Tomcat服务器节点
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
# 可以添加更多Tomcat实例
}
server {
listen 80;
server_name yourdomain.com;
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 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
}
Nginx支持多种负载均衡策略:
weight
参数分配不同权重
nginx
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=1;
nginx
least_conn;
nginx
ip_hash;
可以添加健康检查确保只将请求转发到健康的Tomcat实例:
upstream tomcat_cluster {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
如果应用需要会话保持,可以选择以下方案之一:
使用ip_hash(简单但不完美)
ip_hash;
使用sticky模块(需要额外安装)
sticky cookie srv_id expires=1h domain=.example.com path=/;
应用层会话共享(推荐):配置Tomcat集群使用Redis等共享会话存储
如需Tomcat实例间通信,可配置server.xml
中的集群设置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<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=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
检查Nginx配置语法:
nginx -t
重启Nginx服务:
systemctl restart nginx
验证负载均衡是否工作:
502 Bad Gateway:
会话丢失:
性能问题:
通过以上配置,您应该能够成功搭建一个由Nginx反向代理的Tomcat集群环境。根据实际需求,您可以进一步调整和优化配置参数。