在 Java 项目上线时,Nginx 和 Tomcat 通常采用 “Nginx 作为反向X_X服务器 + Tomcat 作为应用服务器” 的架构模式。这种组合能充分发挥两者优势:Nginx 处理高并发静态资源、负载均衡、SSL 终止等;Tomcat 专注运行 Java 业务逻辑。以下是具体配合方式与关键配置要点:
一、典型架构流程
用户请求 → Nginx(端口 80/443)
↓ (反向X_X转发)
Tomcat(默认端口 8080)
↓ (返回响应)
Nginx → 用户
-
Nginx 职责:
- 接收外部 HTTP/HTTPS 请求
- 静态资源直接由 Nginx 提供(如图片、CSS、JS)
- 动态请求转发给 Tomcat
- 负载均衡(多 Tomcat 实例场景)
- SSL/TLS 解密(减轻 Tomcat 负担)
- 缓存、限流、防盗链等安全策略
-
Tomcat 职责:
- 部署 WAR/JAR 包,执行 Servlet/JSP 逻辑
- 处理数据库交互、业务计算等后端逻辑
- 无需暴露公网端口(可绑定
127.0.0.1:8080)
二、核心配置示例
1. Nginx 配置(nginx.conf 或站点配置)
server {
listen 80;
server_name your-domain.com;
# 静态资源:直接由 Nginx 提供(提升性能)
location /static/ {
root /var/www/html; # 指向静态文件目录
expires 7d; # 设置缓存
add_header Cache-Control "public, immutable";
}
# 动态请求:转发至 Tomcat
location / {
proxy_pass http://127.0.0.1:8080; # Tomcat 本地地址
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; # 保持协议(http/https)
# 可选:支持 WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置(根据业务调整)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# HTTPS 示例(需先配置 SSL 证书)
# server {
# listen 443 ssl;
# ssl_certificate /path/to/cert.pem;
# ssl_certificate_key /path/to/key.pem;
# ...同上 location 配置...
# }
}
✅ 关键点:
proxy_set_header确保 Tomcat 能获取真实客户端 IP 和原始协议- 静态资源路径
/static/避免穿透到 Tomcat- 生产环境建议关闭 Nginx 对 Tomcat 的错误页回退(通过
error_page自定义)
2. Tomcat 配置优化
-
修改
server.xml中的 Connector(仅监听本地):<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" address="127.0.0.1" /> <!-- 关键:只允许本地访问 -->⚠️ 切勿将
address设为0.0.0.0,否则存在安全风险。 -
JVM 参数调优(启动脚本中):
export CATALINA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
三、常见场景增强方案
| 场景 | 解决方案 |
|---|---|
| 多实例部署 | Nginx 配置 upstream 实现轮询/加权负载均衡:upstream tomcat_backend {<br> server 192.168.1.10:8080 weight=3;<br> server 192.168.1.11:8080 weight=2;<br>} |
| 会话共享 | 使用 Redis Session 存储(避免单机 Session 丢失),Tomcat 配置 <Manager className="org.apache.catalina.session.RedisSessionManager"> |
| 健康检查 | Nginx 配置 health_check(需 OpenResty 或第三方模块),自动剔除故障节点 |
| 灰度发布 | Nginx 按 Header/Cookie 分流流量到不同 Tomcat 版本 |
四、验证与排查技巧
-
测试连通性:
curl -I http://your-domain.com/static/logo.png # 应返回 200(Nginx 直接响应) curl -I http://your-domain.com/api/user # 应经 Nginx 转发至 Tomcat -
查看日志定位问题:
- Nginx:
/var/log/nginx/access.log&error.log - Tomcat:
$CATALINA_HOME/logs/catalina.out - 关注
X-Forwarded-For是否包含真实 IP
- Nginx:
-
压力测试:
使用wrk或ab对比单 Tomcat vs Nginx+Tomcat 的性能差异(通常 QPS 提升 3~5 倍)。
五、注意事项
- 🔒 安全:Tomcat 不对外暴露,防火墙仅开放 80/443 给 Nginx
- 🔄 重启顺序:先停 Tomcat → 再改 Nginx 配置 → reload Nginx → 启 Tomcat(避免空连接)
- 📦 静态资源同步:CI/CD 中需同时构建并分发静态资源到 Nginx 目录(或通过 CDN 托管)
这种架构已成为 Java 微服务/单体应用的标准实践,兼顾性能、安全与可维护性。如需进一步探讨容器化(Docker/K8s)下的部署方案,也可继续深入。
CLOUD云枢