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

在 Java 项目上线时,Nginx 通常作为反向X_X服务器(Reverse Proxy),而 Tomcat 作为应用服务器,两者配合使用可以显著提升系统的性能、安全性和可维护性。以下是典型的协作模式与配置要点:


🌐 典型架构流程

用户请求 → Nginx(负载均衡/静态资源处理/SSL 终止) → Tomcat(处理业务逻辑)

分工说明:

组件 职责
Nginx • 接收外部 HTTP/HTTPS 请求
• 静态资源(CSS/JS/图片)直接返回,减轻 Tomcat 压力
• SSL/TLS 卸载(证书管理集中化)
• 负载均衡(多 Tomcat 实例时)
• 限流、防刷、安全头注入等
• 路径转发(如 /api/* → Tomcat)
Tomcat • 部署 WAR/JAR 包,运行 Spring Boot/Spring MVC 等后端服务
• 处理动态业务逻辑、数据库交互、会话管理等
• 通常监听 localhost:8080 或内网端口,不直接暴露公网

🔧 关键配置示例

1. Nginx 配置(nginx.confsites-available/app.conf

upstream tomcat_backend {
    server 127.0.0.1:8080;  # Tomcat 默认端口
    # 若多实例:server 192.168.1.10:8080; server 192.168.1.11:8080;
}

server {
    listen 443 ssl;
    server_name example.com;

    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    # 静态资源优化(直接由 Nginx 提供)
    location /static/ {
        alias /var/www/html/static/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # API 请求转发至 Tomcat
    location / {
        proxy_pass http://tomcat_backend;

        # 传递真实客户端 IP(对日志和风控至关重要)
        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_send_timeout 60s;
        proxy_read_timeout 60s;

        # 可选:启用 gzip 压缩
        gzip on;
        gzip_types text/plain application/json application/javascript text/css;
    }
}

2. Tomcat 配置建议

  • 修改 server.xml:将 Connector 的 address 设为 127.0.0.1(仅本地访问),避免直接暴露:
    <Connector port="8080" protocol="HTTP/1.1"
             address="127.0.0.1"
             connectionTimeout="20000"
             redirectPort="8443" />
  • 关闭 NIO/AJP 非必需端口(如 AJP 默认 8009,若无特殊需求可注释掉)。
  • Spring Boot 项目:无需改 server.xml,但需在 application.yml 中确保不绑定到 0.0.0.0(默认是 0.0.0.0,生产环境建议改为 127.0.0.1 或通过 JVM 参数 -Dspring.boot.admin.url=http://127.0.0.1:8080 控制)。

✅ 优势总结

维度 提升效果
性能 Nginx 高效处理静态资源 + 连接复用;Tomcat 专注业务计算
安全 隐藏 Tomcat 真实地址;Nginx 可集成 WAF、限流、IP 黑白名单
高可用 Nginx 支持健康检查与故障转移(结合 upstream + least_conn 等策略)
运维友好 证书统一在 Nginx 管理;灰度发布、蓝绿部署更灵活

⚠️ 注意事项

  1. 不要将 Tomcat 的 8080 端口直接暴露在公网,否则易受攻击。
  2. *务必设置 `X-Forwarded-` 头**,否则后端日志/IP 识别会显示为 Nginx 服务器 IP。
  3. 若使用 Spring Security,需确认其信任X_X(HttpSecurity 中配置 forwardedHeaderFilter() 或使用 RemoteIpFilter)。
  4. 对于 WebSocket 场景,Nginx 需额外配置 upgradeConnection 头支持(Nginx 1.4+ 原生支持)。

需要我提供一个完整的 Docker Compose 示例(含 Nginx + Tomcat + Spring Boot),或针对特定框架(如 Spring Boot 内嵌容器 vs 独立 Tomcat)的差异化方案吗?

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