奋斗
努力

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

云计算

在 Java 项目上线时,Nginx 和 Tomcat 的配合使用是典型的“反向X_X + 应用服务器”架构。这种分工明确、性能优化的组合被广泛应用于生产环境。


一、角色分工

组件 角色 主要职责
Nginx 反向X_X / 静态资源服务器 接收用户请求,转发给后端;处理静态文件;负载均衡;SSL 终止等
Tomcat Java 应用服务器 运行 WAR/EAR 包;执行 Servlet/JSP;处理动态业务逻辑

二、典型工作流程

用户浏览器 → Nginx(监听80/443端口) → 反向X_X → Tomcat(监听8080端口) → 返回响应
  1. 用户访问 http://example.com
  2. Nginx 收到请求:
    • 如果是静态资源(.css, .js, .png 等),直接由 Nginx 返回
    • 如果是动态请求(如 /api/*),则通过 proxy_pass 转发给 Tomcat
  3. Tomcat 处理业务逻辑,生成 HTML/JSON 响应
  4. 响应经过 Nginx 返回给用户

三、关键配置示例

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

server {
    listen 80;
    server_name example.com;

    # 静态资源直接由 Nginx 处理,提升性能
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        root /var/www/html;
        expires 30d;
        access_log off;
    }

    # 动态请求反向X_X到 Tomcat
    location / {
        proxy_pass http://localhost:8080;
        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_read_timeout 60s;
    }

    # 错误页面自定义
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

2. Tomcat 配置注意事项

  • 修改 server.xml 确保监听正确端口(默认 8080):

    <Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
  • 部署应用:将 WAR 包放入 $CATALINA_HOME/webapps/,或通过 Manager 部署。

  • 建议关闭 Tomcat 的默认欢迎页和目录浏览,增强安全性。


四、为什么这样配合?优势分析

优势 说明
性能优化 Nginx 处理静态资源效率远高于 Tomcat,减轻 Tomcat 负担
负载均衡 Nginx 可配置 upstream,将请求分发到多个 Tomcat 实例
SSL 终止 Nginx 处理 HTTPS 解密,Tomcat 只需处理 HTTP,降低 CPU 开销
安全隔离 Tomcat 不直接暴露公网,仅监听 localhost,减少攻击面
灵活路由 Nginx 可根据 URL、Header、Cookie 等做精细路由规则
缓存与压缩 Nginx 支持 gzip、etag、缓存头,提升前端加载速度

五、进阶场景

1. 多 Tomcat 实例负载均衡

upstream tomcat_cluster {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 backup;
}

server {
    location / {
        proxy_pass http://tomcat_cluster;
        ...
    }
}

2. WebSocket 支持

location /ws/ {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

3. HTTPS 配置

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;

    location / {
        proxy_pass http://localhost:8080;
        ...
    }
}

六、常见误区与建议

误区 正确做法
Tomcat 直接暴露公网 始终让 Nginx 作为入口,Tomcat 仅内网访问
所有请求都走 Tomcat 静态资源务必由 Nginx 处理
忽略 Header 传递 必须传递 X-Real-IP、X-Forwarded-For 等
未设置超时 合理设置 proxy_*_timeout,避免连接挂起
Tomcat 和 Nginx 在同一机器 生产环境建议分离部署,便于扩展和维护

七、总结

Nginx 是“门面”,Tomcat 是“引擎”。
Nginx 负责高并发接入、静态服务、安全过滤、负载均衡;
Tomcat 专注 Java 业务逻辑执行。
二者各司其职,共同构建高性能、高可用、易扩展的 Web 架构。

在生产环境中,这种搭配已成为 Java Web 项目的标准实践,值得深入理解和规范配置。

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