Java后端服务部署时,Nginx和Tomcat一般怎么配合使用?

在 Java 后端服务部署中,Nginx 与 Tomcat 的典型配合方式是采用 「反向X_X + 静态资源分离」 架构,Nginx 作为前置网关(边缘服务器),Tomcat 专注运行 Java 应用。这种组合兼顾性能、安全、可扩展性与运维灵活性。以下是标准实践详解:


✅ 一、核心分工(Why 这样配合?)

组件 职责 优势说明
Nginx ✅ 反向X_X(转发请求到 Tomcat)
✅ 静态资源(JS/CSS/IMG/HTML)直接服务
✅ HTTPS 终止(SSL 卸载)
✅ 负载均衡(多 Tomcat 实例)
✅ 请求限流、黑白名单、日志审计、缓存(如静态页)
高并发、低内存占用、成熟稳定、配置灵活
Tomcat ✅ 运行 Servlet/JSP(即 Spring Boot/Spring MVC 等 Java Web 应用)
✅ 处理业务逻辑、数据库交互、会话管理(Session)
专精 Java EE/Web 容器,无需处理网络层细节

⚠️ 注意:Spring Boot 内嵌 Tomcat 时,仍建议前置 Nginx(而非直接暴露 Tomcat 端口),原因:安全性(隐藏后端技术栈)、HTTPS 统一管理、动静分离、更优的连接复用与超时控制等。


✅ 二、典型部署架构图

用户浏览器
    ↓ (HTTPS/HTTP)
[ Nginx(80/443端口) ]
    ├─ ✅ 静态资源 → 直接读取 /var/www/static/ 返回(不走 Tomcat)
    ├─ ✅ /api/**, /admin/** → 反向X_X到 http://127.0.0.1:8080/
    └─ ✅ 多实例场景 → 转发到 upstream tomcat_cluster { server 192.168.1.10:8080; server 192.168.1.11:8080; }
                ↓
        [ Tomcat 1(8080) ]   [ Tomcat 2(8080) ]
              ↓                      ↓
        Spring Boot App         Spring Boot App

✅ 三、关键 Nginx 配置示例(/etc/nginx/conf.d/app.conf)

upstream tomcat_backend {
    server 127.0.0.1:8080 weight=5;
    # server 192.168.1.10:8080 backup;  # 可配备用节点
    keepalive 32;  # 保持长连接,减少 Tomcat 连接开销
}

server {
    listen       80;
    server_name  example.com;

    # HTTP 重定向到 HTTPS(推荐)
    return 301 https://$server_name$request_uri;
}

server {
    listen       443 ssl http2;
    server_name  example.com;

    # SSL 配置(证书路径按实际调整)
    ssl_certificate      /etc/ssl/certs/example.com.pem;
    ssl_certificate_key  /etc/ssl/private/example.com.key;
    ssl_protocols        TLSv1.2 TLSv1.3;
    ssl_ciphers          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

    # 静态资源:优先由 Nginx 直接服务(高效)
    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot)$ {
        root   /var/www/myapp/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # HTML 文件(可选:Nginx 缓存或透传给 Tomcat)
    location / {
        root /var/www/myapp/;
        try_files $uri $uri/ @tomcat;
    }

    # API 和动态请求全部交给 Tomcat
    location @tomcat {
        proxy_pass http://tomcat_backend;
        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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        # 超时设置(避免长阻塞)
        proxy_connect_timeout 30s;
        proxy_send_timeout    300s;
        proxy_read_timeout    300s;

        # 传递 WebSocket(如 Spring Boot 使用 STOMP/WebSocket)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 健康检查(可选,供监控或负载均衡探测)
    location /health {
        return 200 "OK";
        add_header Content-Type text/plain;
    }
}

✅ 四、Tomcat 关键配合配置(server.xml 或 application.properties)

  1. 关闭 Tomcat 的 HTTP 端口(仅保留 AJP 或禁用)
    若只通过 Nginx 访问,注释或删除 <Connector port="8080" ... /> 的 HTTP 连接器,或改用 address="127.0.0.1" 限制本地访问:

    <!-- 仅允许本地 Nginx 访问 -->
    <Connector port="8080" protocol="HTTP/1.1"
              address="127.0.0.1"
              connectionTimeout="20000"
              redirectPort="8443" />
  2. 正确解析真实客户端信息(重要!)
    在 application.yml(Spring Boot)中启用:

    server:
     forward-headers-strategy: framework  # Spring Boot 2.2+
    # 或显式配置:
    #   tomcat:
    #     remote-ip-header: x-forwarded-for
    #     protocol-header: x-forwarded-proto

    ✅ 这确保 request.getRemoteAddr()、request.isSecure()、request.getRequestURL() 等返回真实值(而非 Nginx IP)。

  3. Session 共享(集群场景)

    • 单机:默认内存 Session 即可
    • 多 Tomcat:使用 Redis(Spring Session)、数据库或粘性 Session(ip_hash in Nginx)

✅ 五、生产环境最佳实践

场景 推荐做法
HTTPS ✅ Nginx 终止 SSL(卸载 CPU 密码运算),Tomcat 用 HTTP 通信;避免 Tomcat 自己处理 SSL(性能差、配置复杂)
高并发 ✅ Nginx worker_processes auto; + worker_connections 10240;;Tomcat 调整 maxThreads=500、acceptCount=100
日志 ✅ Nginx 记访问日志(含 $upstream_response_time);Tomcat 记应用日志(ERROR/WARN);两者时间戳对齐便于排障
监控 ✅ Nginx 暴露 stub_status 或用 Prometheus exporter;Tomcat 开启 JMX;APM(SkyWalking/Pinpoint)探针注入 JVM
灰度发布 ✅ Nginx 根据 Header/Cookie/Query 参数路由到不同 Tomcat 分组(map + split_clients)

❌ 常见误区提醒

  • × 直接暴露 Tomcat 8080 端口给公网(安全风险大,无防护层)
  • × Nginx 和 Tomcat 都开启 HTTPS(冗余且性能损耗)
  • × 忘记配置 X-Forwarded-* 头 → 导致 Spring Security 重定向错误、HTTPS 判断失败
  • × 静态资源未由 Nginx 服务 → Tomcat 处理大量小文件,吞吐骤降
  • × Nginx proxy_pass 后缺少 / 导致路径错乱(如 proxy_pass http://backend; vs proxy_pass http://backend/;)

✅ 总结一句话

Nginx 是“守门人”与“快递员”,负责流量调度、安全加固和静态提速;Tomcat 是“业务处理器”,专注执行 Java 字节码与业务逻辑。二者各司其职,协同构建高性能、高可用、易运维的 Java Web 服务。

如需进一步了解:
🔹 Spring Boot + Nginx 零配置 HTTPS 实战
🔹 Nginx 动态 upstream(结合 Consul/Eureka)
🔹 Tomcat 集群 Session Redis 方案
欢迎随时提出具体场景,我可以为你定制配置模板或排障指南。

未经允许不得转载:CLOUD技术博 » Java后端服务部署时,Nginx和Tomcat一般怎么配合使用?