全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

Nginx+Tomcat集群部署

NGINX + Tomcat 是 Java Web 应用的经典架构。NGINX 处理静态资源和负载均衡,Tomcat 专注业务逻辑。

基础架构

nginx
Client → NGINX (80/443) → Tomcat1 (8080)
                          → Tomcat2 (8081)
                          → Tomcat3 (8082)

NGINX 配置

反向代理到 Tomcat

XML
upstream tomcat_cluster {
    least_conn;
    
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    
    keepalive 32;
}

server {
    listen 80;
    server_name app.example.com;
    
    # 静态资源直接处理
    location /static/ {
        root /var/www/app;
        expires 30d;
    }
    
    # Java 应用代理
    location / {
        proxy_pass http://tomcat_cluster;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        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_http_version 1.1Connection "" 是 keepalive 的必要条件。否则每次请求都新建 TCP 连接。

Tomcat 配置

server.xml 调整

XML
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           proxyPort="80"
           proxyName="app.example.com"
           scheme="http" />

设置 proxyPortproxyName 让 Tomcat 感知代理后的真实地址。request.getRequestURL() 返回正确 URL。

获取真实客户端 IP

nginx
<!-- server.xml 中添加 Valve -->
<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for"
       proxiesHeader="x-forwarded-by"
       protocolHeader="x-forwarded-proto" />

Tomcat 默认获取直连 IP,需配置 RemoteIpValve 解析 X-Forwarded-For 头获取真实客户端 IP。

动静分离

资源分离

XML
server {
    # 静态资源 - NGINX 直接返回
    location ~* \.(css|js|jpg|png|gif|svg|woff|woff2|ico)$ {
        root /var/www/app/static;
        expires 365d;
        add_header Cache-Control "public, immutable";
    }
    
    # JSP/Servlet - 转发到 Tomcat
    location ~ \.(jsp|do|action)$ {
        proxy_pass http://tomcat_cluster;
    }
    
    # 其他请求 - 默认走 Tomcat
    location / {
        proxy_pass http://tomcat_cluster;
    }
}

静态资源不经过 Tomcat,减少 Java 进程 CPU 和内存消耗。构建产物部署到 /var/www/app/static 目录。

Session 共享

Redis 存储

XML
<!-- Tomcat context.xml -->
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="127.0.0.1"
         port="6379"
         database="0"
         maxInactiveInterval="60" />

Session 存储在 Redis 中,任何 Tomcat 节点都能读取。NGINX 无需配置 ip_hash,使用 least_conn 即可。

健康检查

Tomcat 健康端点

nginx
<!-- web.xml 添加健康检查 Servlet -->
<servlet>
    <servlet-name>health</servlet-name>
    <servlet-class>com.app.HealthCheckServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>health</servlet-name>
    <url-pattern>/health</url-pattern>
</servlet-mapping>
text
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;
    server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}

要点总结

  • NGINX 使用 least_conn + keepalive 代理到 Tomcat 集群
  • proxy_http_version 1.1 + Connection "" 是 keepalive 必要条件
  • Tomcat 配置 RemoteIpValve 获取真实客户端 IP
  • 动静分离:静态资源 NGINX 直接返回,动态请求转发 Tomcat
  • Session 使用 Redis 共享存储,无需 ip_hash
  • 构建产物部署到 NGINX 静态目录,WAR 包部署到 Tomcat
  • 配合健康检查 Servlet 实现自动故障摘除

📝 发现内容有误?点击此处直接编辑

← 上一篇 限流算法(令牌桶、漏桶)
下一篇 → Nginx集群架构设计
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库