在 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)
-
关闭 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" /> -
正确解析真实客户端信息(重要!)
在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)。 -
Session 共享(集群场景)
- 单机:默认内存 Session 即可
- 多 Tomcat:使用 Redis(Spring Session)、数据库或粘性 Session(
ip_hashin 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;vsproxy_pass http://backend/;)
✅ 总结一句话
Nginx 是“守门人”与“快递员”,负责流量调度、安全加固和静态提速;Tomcat 是“业务处理器”,专注执行 Java 字节码与业务逻辑。二者各司其职,协同构建高性能、高可用、易运维的 Java Web 服务。
如需进一步了解:
🔹 Spring Boot + Nginx 零配置 HTTPS 实战
🔹 Nginx 动态 upstream(结合 Consul/Eureka)
🔹 Tomcat 集群 Session Redis 方案
欢迎随时提出具体场景,我可以为你定制配置模板或排障指南。
CLOUD技术博