在 Java 项目上线时,Nginx 和 Tomcat 的配合使用是典型的“反向X_X + 应用服务器”架构。这种分工明确、性能优化的组合被广泛应用于生产环境。
一、角色分工
| 组件 | 角色 | 主要职责 |
|---|---|---|
| Nginx | 反向X_X / 静态资源服务器 | 接收用户请求,转发给后端;处理静态文件;负载均衡;SSL 终止等 |
| Tomcat | Java 应用服务器 | 运行 WAR/EAR 包;执行 Servlet/JSP;处理动态业务逻辑 |
二、典型工作流程
用户浏览器 → Nginx(监听80/443端口) → 反向X_X → Tomcat(监听8080端口) → 返回响应
- 用户访问
http://example.com - Nginx 收到请求:
- 如果是静态资源(
.css,.js,.png等),直接由 Nginx 返回 - 如果是动态请求(如
/api/*),则通过proxy_pass转发给 Tomcat
- 如果是静态资源(
- Tomcat 处理业务逻辑,生成 HTML/JSON 响应
- 响应经过 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 项目的标准实践,值得深入理解和规范配置。
云服务器