在 Java 项目上线时,Nginx 通常作为反向X_X服务器(Reverse Proxy),而 Tomcat 作为应用服务器,两者配合使用可以显著提升系统的性能、安全性和可维护性。以下是典型的协作模式与配置要点:
🌐 典型架构流程
用户请求 → Nginx(负载均衡/静态资源处理/SSL 终止) → Tomcat(处理业务逻辑)
分工说明:
| 组件 | 职责 |
|---|---|
| Nginx | • 接收外部 HTTP/HTTPS 请求 • 静态资源(CSS/JS/图片)直接返回,减轻 Tomcat 压力 • SSL/TLS 卸载(证书管理集中化) • 负载均衡(多 Tomcat 实例时) • 限流、防刷、安全头注入等 • 路径转发(如 /api/* → Tomcat) |
| Tomcat | • 部署 WAR/JAR 包,运行 Spring Boot/Spring MVC 等后端服务 • 处理动态业务逻辑、数据库交互、会话管理等 • 通常监听 localhost:8080 或内网端口,不直接暴露公网 |
🔧 关键配置示例
1. Nginx 配置(nginx.conf 或 sites-available/app.conf)
upstream tomcat_backend {
server 127.0.0.1:8080; # Tomcat 默认端口
# 若多实例:server 192.168.1.10:8080; server 192.168.1.11:8080;
}
server {
listen 443 ssl;
server_name example.com;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# 静态资源优化(直接由 Nginx 提供)
location /static/ {
alias /var/www/html/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# API 请求转发至 Tomcat
location / {
proxy_pass http://tomcat_backend;
# 传递真实客户端 IP(对日志和风控至关重要)
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_send_timeout 60s;
proxy_read_timeout 60s;
# 可选:启用 gzip 压缩
gzip on;
gzip_types text/plain application/json application/javascript text/css;
}
}
2. Tomcat 配置建议
- 修改
server.xml:将 Connector 的address设为127.0.0.1(仅本地访问),避免直接暴露:<Connector port="8080" protocol="HTTP/1.1" address="127.0.0.1" connectionTimeout="20000" redirectPort="8443" /> - 关闭 NIO/AJP 非必需端口(如 AJP 默认 8009,若无特殊需求可注释掉)。
- Spring Boot 项目:无需改
server.xml,但需在application.yml中确保不绑定到0.0.0.0(默认是0.0.0.0,生产环境建议改为127.0.0.1或通过 JVM 参数-Dspring.boot.admin.url=http://127.0.0.1:8080控制)。
✅ 优势总结
| 维度 | 提升效果 |
|---|---|
| 性能 | Nginx 高效处理静态资源 + 连接复用;Tomcat 专注业务计算 |
| 安全 | 隐藏 Tomcat 真实地址;Nginx 可集成 WAF、限流、IP 黑白名单 |
| 高可用 | Nginx 支持健康检查与故障转移(结合 upstream + least_conn 等策略) |
| 运维友好 | 证书统一在 Nginx 管理;灰度发布、蓝绿部署更灵活 |
⚠️ 注意事项
- 不要将 Tomcat 的 8080 端口直接暴露在公网,否则易受攻击。
- *务必设置 `X-Forwarded-` 头**,否则后端日志/IP 识别会显示为 Nginx 服务器 IP。
- 若使用 Spring Security,需确认其信任X_X(
HttpSecurity中配置forwardedHeaderFilter()或使用RemoteIpFilter)。 - 对于 WebSocket 场景,Nginx 需额外配置
upgrade和Connection头支持(Nginx 1.4+ 原生支持)。
需要我提供一个完整的 Docker Compose 示例(含 Nginx + Tomcat + Spring Boot),或针对特定框架(如 Spring Boot 内嵌容器 vs 独立 Tomcat)的差异化方案吗?
CLOUD技术博