Nginx + Tomcat 是一种常见的 Java Web 应用部署架构,其中: - Nginx 作为前端反向代理和负载均衡器 - Tomcat 作为后端应用服务器处理 Java Web 应用 - 多个 Tomcat 实例组成集群提供高可用性
Nginx 服务器: 192.168.1.100
Tomcat 服务器1: 192.168.1.101
Tomcat 服务器2: 192.168.1.102
Tomcat 服务器3: 192.168.1.103
在每个 Tomcat 服务器上:
# 解压安装 Tomcat
tar -xzf apache-tomcat-9.0.xx.tar.gz
mv apache-tomcat-9.0.xx /usr/local/tomcat
# 修改 server.xml 中的 Connector 配置
vi /usr/local/tomcat/conf/server.xml
<!-- 修改 HTTP 连接器 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
如果需要会话共享,在 server.xml 中添加:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<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>
在 web.xml 中添加 <distributable/>
标签:
<web-app>
<distributable/>
...
</web-app>
http {
upstream tomcat_cluster {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
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 120s;
proxy_send_timeout 120s;
# 启用缓冲区
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
proxy_max_temp_file_size 0;
}
}
}
Nginx 支持多种负载均衡算法:
upstream tomcat_cluster {
# 1. 轮询(默认)
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# 2. 加权轮询
server 192.168.1.103:8080 weight=3;
# 3. IP哈希(保持会话)
# ip_hash;
# 4. 最少连接
# least_conn;
# 服务器状态参数
server 192.168.1.104:8080 backup; # 备用服务器
server 192.168.1.105:8080 down; # 暂时不可用
}
upstream tomcat_cluster {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# 健康检查参数
check interval=3000 rise=2 fall=3 timeout=2000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
# 健康检查状态页面
location /nginx_status {
check_status;
access_log off;
allow 192.168.1.0/24;
deny all;
}
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://tomcat_cluster;
# 其他 proxy 设置...
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
root /path/to/static/files;
expires 30d;
access_log off;
add_header Cache-Control "public";
}
location / {
proxy_pass http://tomcat_cluster;
# 其他 proxy 设置...
}
location /ws/ {
proxy_pass http://tomcat_cluster;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
# 工作进程数,通常设置为CPU核心数
worker_processes auto;
# 每个工作进程的最大连接数
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
http {
# 开启高效文件传输模式
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 保持连接超时时间
keepalive_timeout 65;
keepalive_requests 1000;
# 关闭服务器版本信息
server_tokens off;
# Gzip 压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
修改 catalina.sh 或 catalina.bat 的 JVM 参数:
# 在 catalina.sh 中添加
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump"
nginx -t
测试配置# Nginx
nginx -t # 测试配置
nginx -s reload # 重载配置
nginx -s stop # 停止
# Tomcat
./startup.sh # 启动
./shutdown.sh # 停止
tail -f ../logs/catalina.out # 查看日志
502 Bad Gateway
Session 不共享
性能问题
静态资源加载问题
通过以上配置,您可以构建一个高性能、高可用的 Nginx + Tomcat 集群环境,满足企业级 Web 应用的需求。