Nginx + Tomcat 负载均衡集群架构如下:
客户端 → Nginx (负载均衡器) → [Tomcat实例1, Tomcat实例2, ... Tomcat实例N]
# CentOS
sudo yum install epel-release
sudo yum install nginx
# Ubuntu
sudo apt update
sudo apt install nginx
编辑Nginx配置文件(通常位于/etc/nginx/nginx.conf
或/etc/nginx/conf.d/default.conf
):
http {
upstream tomcat_cluster {
# 负载均衡策略:
# least_conn - 最少连接
# ip_hash - IP哈希(会话保持)
# 默认是轮询(round-robin)
# 配置Tomcat服务器节点
server 192.168.1.101:8080 weight=3; # weight表示权重
server 192.168.1.102:8080;
server 192.168.1.103:8080 backup; # 备用服务器
}
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 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
# 启用HTTP长连接
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# 静态资源可直接由Nginx处理
location ~* \.(jpg|jpeg|png|gif|ico|css|js|html)$ {
root /path/to/static/files;
expires 30d;
}
}
}
# CentOS
sudo yum install java-11-openjdk-devel
# Ubuntu
sudo apt install openjdk-11-jdk
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.xx/bin/apache-tomcat-9.0.xx.tar.gz
tar -xzf apache-tomcat-9.0.xx.tar.gz
mv apache-tomcat-9.0.xx /opt/tomcat
编辑/opt/tomcat/conf/server.xml
:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="25"
maxConnections="1000"
acceptCount="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
<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">
<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=""/>
<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>
启动Tomcat:
/opt/tomcat/bin/startup.sh
启动Nginx:
sudo systemctl start nginx
sudo systemctl enable nginx
# 在nginx.conf的http部分添加
worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 每个worker进程能打开的文件描述符数量
events {
worker_connections 65535; # 每个worker进程的最大连接数
use epoll; # Linux下高性能事件模型
multi_accept on; # 一次接受多个连接
}
http {
# 启用高效文件传输模式
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接超时设置
keepalive_timeout 65;
keepalive_requests 1000;
# 关闭不必要日志
access_log off;
# 或限制日志级别
# access_log /var/log/nginx/access.log main buffer=32k flush=1m;
# Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
}
编辑/opt/tomcat/bin/setenv.sh
(如不存在则创建):
export CATALINA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs/heapdump.hprof"
如果应用需要会话保持,可选择以下方案之一:
1. Nginx ip_hash:简单但不够灵活
nginx
upstream tomcat_cluster {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
启用Tomcat Manager应用,或使用JMX监控
502 Bad Gateway
proxy_connect_timeout
值性能瓶颈
top
、vmstat
等工具监控服务器资源会话丢失
静态资源加载慢
通过以上配置,您可以搭建一个高性能的Nginx+Tomcat负载均衡集群,能够处理高并发请求并提供良好的用户体验。