一、为什么需要两者配合?
| 组件 | 擅长 | 不擅长 |
|---|---|---|
| Nginx | 静态文件、并发连接、负载均衡、反向代理 | 跑 Java 程序 |
| Tomcat | 跑 Java Web 应用(JSP/Servlet) | 处理高并发静态文件 |
结论:让 Nginx 处理它擅长的,Tomcat 处理它擅长的,两者配合达到最佳效果。
二、典型架构图
用户请求
↓
Nginx(80/443端口)
↓
├── 静态文件(图片/CSS/JS)→ 直接返回
├── 动态请求(.jsp .do) → Tomcat(8080端口)
├── 负载均衡 → 多个Tomcat
└── 缓存 → 减少Tomcat压力
三、具体场景举例
场景1:Java Web 项目 + 静态资源分离
server {
listen 80;
server_name example.com;
# 静态文件由 Nginx 直接处理
location /static/ {
alias /var/www/static/;
expires 30d;
}
# 图片由 Nginx 直接处理
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/html;
expires 30d;
}
# 动态请求转发给 Tomcat
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
场景2:负载均衡 + 多台 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 {
listen 80;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
}
}
场景3:HTTPS 卸载(SSL终结)
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:8080; # 转给Tomcat(HTTP)
}
}
Nginx 处理 SSL 加密,Tomcat 不用处理 HTTPS,减轻负担。
场景4:动静分离 + 缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /data/static;
expires 7d;
add_header Cache-Control "public";
}
location / {
proxy_pass http://tomcat;
proxy_cache my_cache;
proxy_cache_valid 200 10m;
}
场景5:多域名/多应用代理
# 同一个 Nginx,背后多个 Tomcat 应用
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://127.0.0.1:8081; # Tomcat1
}
}
server {
listen 80;
server_name app2.example.com;
location / {
proxy_pass http://127.0.0.1:8082; # Tomcat2
}
}
四、Nginx 帮 Tomcat 做了什么
| 功能 | 说明 |
|---|---|
| 静态文件处理 | Tomcat 处理静态文件很慢,Nginx 极快 |
| 负载均衡 | 把请求分发给多个 Tomcat |
| SSL 终结 | Nginx 处理 HTTPS,Tomcat 只用 HTTP |
| 缓存 | 缓存静态内容甚至动态页面 |
| 压缩 | Gzip 压缩,减少带宽 |
| 限流 | 防止 Tomcat 被冲垮 |
| 访问控制 | IP 黑白名单 |
| 日志 | 访问日志由 Nginx 记录 |
五、性能对比
| 指标 | 只用 Tomcat | Nginx + Tomcat |
|---|---|---|
| 静态文件并发 | 500 | 10000+ |
| CPU 占用 | Tomcat 处理静态文件浪费 CPU | Nginx 轻量处理 |
| SSL 性能 | 一般 | 极好(OpenSSL) |
| 内存占用 | Tomcat 内存吃紧 | 静态文件不占 Tomcat 内存 |
六、一句话总结
需要 Nginx + Tomcat 的场景:任何 Java Web 项目,尤其是需要高并发、静态资源多、负载均衡、SSL 加速的生产环境。
发表回复