Java项目上线时Nginx和Tomcat如何配合使用?

在 Java 项目上线时,Nginx 和 Tomcat 通常采用 “Nginx 作为反向X_X服务器 + Tomcat 作为应用服务器” 的架构模式。这种组合能充分发挥两者优势:Nginx 处理高并发静态资源、负载均衡、SSL 终止等;Tomcat 专注运行 Java 业务逻辑。以下是具体配合方式与关键配置要点:


一、典型架构流程

用户请求 → Nginx(端口 80/443) 
         ↓ (反向X_X转发)
      Tomcat(默认端口 8080)
         ↓ (返回响应)
      Nginx → 用户
  • Nginx 职责

    • 接收外部 HTTP/HTTPS 请求
    • 静态资源直接由 Nginx 提供(如图片、CSS、JS)
    • 动态请求转发给 Tomcat
    • 负载均衡(多 Tomcat 实例场景)
    • SSL/TLS 解密(减轻 Tomcat 负担)
    • 缓存、限流、防盗链等安全策略
  • Tomcat 职责

    • 部署 WAR/JAR 包,执行 Servlet/JSP 逻辑
    • 处理数据库交互、业务计算等后端逻辑
    • 无需暴露公网端口(可绑定 127.0.0.1:8080

二、核心配置示例

1. Nginx 配置(nginx.conf 或站点配置)

server {
    listen 80;
    server_name your-domain.com;

    # 静态资源:直接由 Nginx 提供(提升性能)
    location /static/ {
        root /var/www/html;  # 指向静态文件目录
        expires 7d;          # 设置缓存
        add_header Cache-Control "public, immutable";
    }

    # 动态请求:转发至 Tomcat
    location / {
        proxy_pass http://127.0.0.1:8080;  # Tomcat 本地地址
        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;  # 保持协议(http/https)

        # 可选:支持 WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 超时设置(根据业务调整)
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # HTTPS 示例(需先配置 SSL 证书)
    # server {
    #     listen 443 ssl;
    #     ssl_certificate /path/to/cert.pem;
    #     ssl_certificate_key /path/to/key.pem;
    #     ...同上 location 配置...
    # }
}

✅ 关键点:

  • proxy_set_header 确保 Tomcat 能获取真实客户端 IP 和原始协议
  • 静态资源路径 /static/ 避免穿透到 Tomcat
  • 生产环境建议关闭 Nginx 对 Tomcat 的错误页回退(通过 error_page 自定义)

2. Tomcat 配置优化

  • 修改 server.xml 中的 Connector(仅监听本地):

    <Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443"
             address="127.0.0.1" />  <!-- 关键:只允许本地访问 -->

    ⚠️ 切勿将 address 设为 0.0.0.0,否则存在安全风险。

  • JVM 参数调优(启动脚本中):

    export CATALINA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

三、常见场景增强方案

场景 解决方案
多实例部署 Nginx 配置 upstream 实现轮询/加权负载均衡:
upstream tomcat_backend {<br> server 192.168.1.10:8080 weight=3;<br> server 192.168.1.11:8080 weight=2;<br>}
会话共享 使用 Redis Session 存储(避免单机 Session 丢失),Tomcat 配置 <Manager className="org.apache.catalina.session.RedisSessionManager">
健康检查 Nginx 配置 health_check(需 OpenResty 或第三方模块),自动剔除故障节点
灰度发布 Nginx 按 Header/Cookie 分流流量到不同 Tomcat 版本

四、验证与排查技巧

  1. 测试连通性

    curl -I http://your-domain.com/static/logo.png      # 应返回 200(Nginx 直接响应)
    curl -I http://your-domain.com/api/user            # 应经 Nginx 转发至 Tomcat
  2. 查看日志定位问题

    • Nginx:/var/log/nginx/access.log & error.log
    • Tomcat:$CATALINA_HOME/logs/catalina.out
    • 关注 X-Forwarded-For 是否包含真实 IP
  3. 压力测试
    使用 wrkab 对比单 Tomcat vs Nginx+Tomcat 的性能差异(通常 QPS 提升 3~5 倍)。


五、注意事项

  • 🔒 安全:Tomcat 不对外暴露,防火墙仅开放 80/443 给 Nginx
  • 🔄 重启顺序:先停 Tomcat → 再改 Nginx 配置 → reload Nginx → 启 Tomcat(避免空连接)
  • 📦 静态资源同步:CI/CD 中需同时构建并分发静态资源到 Nginx 目录(或通过 CDN 托管)

这种架构已成为 Java 微服务/单体应用的标准实践,兼顾性能、安全与可维护性。如需进一步探讨容器化(Docker/K8s)下的部署方案,也可继续深入。

未经允许不得转载:CLOUD云枢 » Java项目上线时Nginx和Tomcat如何配合使用?