插件窝 干货文章 Nginx+Tomcat反向代理、负载均衡、集群部署的方法

Nginx+Tomcat反向代理、负载均衡、集群部署的方法

Tomcat Nginx server proxy 696    来源:    2025-04-25

Nginx + Tomcat 反向代理、负载均衡与集群部署方案

一、基础架构概述

Nginx + Tomcat 是一种常见的 Java Web 应用部署架构,其中: - Nginx 作为前端反向代理和负载均衡器 - Tomcat 作为后端应用服务器处理 Java Web 应用 - 多个 Tomcat 实例组成集群提供高可用性

二、环境准备

1. 所需软件

  • Nginx (推荐 1.18+ 或最新稳定版)
  • Tomcat (推荐 8.5+ 或 9.x)
  • JDK (与 Tomcat 版本匹配)

2. 服务器规划示例

Nginx 服务器: 192.168.1.100
Tomcat 服务器1: 192.168.1.101
Tomcat 服务器2: 192.168.1.102
Tomcat 服务器3: 192.168.1.103

三、Tomcat 集群配置

1. 基础 Tomcat 配置

在每个 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"/>

2. 集群配置(可选)

如果需要会话共享,在 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>

四、Nginx 配置

1. 基础反向代理配置

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;
        }
    }
}

2. 负载均衡策略

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;    # 暂时不可用
}

3. 健康检查配置

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;
    }
}

五、高级配置

1. HTTPS 配置

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;
}

2. 静态资源分离

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 设置...
}

3. WebSocket 支持

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;
}

六、优化建议

1. Nginx 优化

# 工作进程数,通常设置为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;
}

2. Tomcat 优化

修改 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"

七、监控与维护

1. Nginx 监控

  • 使用 nginx -t 测试配置
  • 查看访问日志和错误日志
  • 监控 Nginx 状态页面

2. Tomcat 监控

  • 配置 manager 应用进行管理
  • 使用 JMX 监控 JVM 状态
  • 监控 catalina.out 日志

3. 常用命令

# Nginx
nginx -t            # 测试配置
nginx -s reload     # 重载配置
nginx -s stop       # 停止

# Tomcat
./startup.sh       # 启动
./shutdown.sh      # 停止
tail -f ../logs/catalina.out  # 查看日志

八、常见问题解决

  1. 502 Bad Gateway

    • 检查 Tomcat 是否正常运行
    • 检查防火墙设置
    • 增加 proxy_connect_timeout 值
  2. Session 不共享

    • 确保集群配置正确
    • 考虑使用 Redis 等外部 session 存储
    • 或者使用 sticky session (ip_hash)
  3. 性能问题

    • 检查 JVM 内存设置
    • 优化数据库查询
    • 增加 Nginx 缓存
  4. 静态资源加载问题

    • 检查静态资源路径配置
    • 确保文件权限正确
    • 验证 MIME 类型设置

通过以上配置,您可以构建一个高性能、高可用的 Nginx + Tomcat 集群环境,满足企业级 Web 应用的需求。