
Nginx 是用 C 语言编写的,非常轻量高效,且擅长处理高并发的 I/O 操作。对于静态文件(图片、CSS、JS),Nginx 不需要转发给 Tomcat,直接自己返回,速度比 Tomcat 快得多。
直接访问 Tomcat vs Nginx 代理
| 特性 | 直接访问 Tomcat | Nginx 代理 + Tomcat |
|---|---|---|
| 速度 | 理论上稍快(少一次转发) | 稍慢(增加转发),但可忽略 |
| 安全性 | 低(直接暴露端口和应用) | 高(隐藏后端,集中防护) |
| 静态资源处理 | 差(Tomcat 不擅长) | 好(Nginx 直接处理) |
| 负载均衡 | 无法实现 | 支持(可分发到多个 Tomcat) |
| HTTPS 支持 | 每个 Tomcat 都要配置 SSL | 统一在 Nginx 配置,更高效 |
| URL 路由/重写 | 复杂,需在 Java 代码中实现 | 简单,Nginx 配置即可 |
| 适用场景 | 个人项目、测试环境 | 生产环境、企业级应用 |
基础配置步骤(单Tomcat场景)
1. 环境准备
- 服务器:推荐CentOS 7/8、Ubuntu 20.04+,确保开放80/443/8080端口
- 软件版本:Nginx 1.20+,Tomcat 9.x/10.x(根据Java版本选择,Tomcat10对应Java11+)
- 依赖:安装JDK 8/11/17(根据项目需求)
2. Tomcat基础配置
修改TOMCAT_HOME/conf/server.xml,优化核心参数:
<!-- 配置HTTP连接器,调整线程池参数 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="800" <!-- 最大线程数,根据CPU核心数调整(1核=100-200) -->
minSpareThreads="100" <!-- 最小空闲线程数 -->
acceptCount="1000" <!-- 等待队列长度 -->
compression="on" <!-- 开启Gzip压缩 -->
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
<!-- 配置引擎,添加默认主机 -->
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 配置项目上下文路径,例如将myapp部署到根路径 -->
<Context path="" docBase="/opt/tomcat/webapps/myapp" reloadable="false"/>
</Host>
</Engine>
3. Nginx核心配置(反向代理+动静分离)
server {
listen 80;
server_name your_domain.com; # 替换为你的域名或IP
# 静态资源直接由Nginx处理,提升性能
location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg)$ {
root /opt/tomcat/webapps/myapp/static; # 静态资源存放路径
expires 30d; # 浏览器缓存30天
add_header Cache-Control "public, no-transform";
}
# 动态请求转发到Tomcat处理
location / {
proxy_pass http://127.0.0.1:8080; # 转发到Tomcat的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_connect_timeout 60s; # 连接超时时间
proxy_send_timeout 60s; # 发送超时时间
proxy_read_timeout 60s; # 读取超时时间
}
# 配置错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
4. 验证配置与启动
# 检查Nginx配置语法
nginx -t
# 重启Nginx
systemctl restart nginx
# 启动Tomcat并设置开机自启
systemctl start tomcat
systemctl enable tomcat
🚀 进阶配置(多Tomcat集群+负载均衡)
当单Tomcat无法满足并发需求时,可配置Tomcat集群,由Nginx做负载均衡:
1. 部署多台Tomcat
- 复制Tomcat目录,分别命名为tomcat8080、tomcat8081、tomcat8082
- 修改每台Tomcat的
server.xml,调整端口:- 8080端口改为8081、8082
- shutdown端口改为8006、8007
- AJP端口改为8009、8010
2. Nginx负载均衡配置
在nginx.conf的http块中添加上游服务器配置:
# 定义Tomcat集群节点
upstream tomcat_cluster {
server 127.0.0.1:8080 weight=3; # weight值越大,分配的请求越多
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=1;
# 可选:配置健康检查(需要Nginx Plus或第三方模块)
# check interval=3000 rise=2 fall=3 timeout=1000 type=http;
# check_http_send "HEAD /health HTTP/1.1\r\nHost: localhost\r\n\r\n";
}
# 在server块中修改转发目标
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://tomcat_cluster; # 转发到负载均衡集群
# 其他proxy_set_header配置同基础版
}
}
🔒 生产环境必备优化
1. 安全配置
- 配置HTTPS:使用Let's Encrypt免费证书,在Nginx中配置443端口
- 限制Tomcat访问:仅允许Nginx所在IP访问Tomcat的8080端口(通过防火墙或Tomcat的RemoteAddrValve)
- 禁用Tomcat管理控制台或设置强密码
- 配置Nginx的WAF规则,防止SQL注入、XSS攻击
2. 性能优化
- Nginx开启gzip压缩、开启open_file_cache
- Tomcat调整线程池、启用APR(Apache Portable Runtime)提升IO性能
- 配置JVM参数:修改
TOMCAT_HOME/bin/catalina.sh,添加:
JAVA_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
(根据服务器内存调整,Xms/Xmx通常设置为物理内存的1/2-1/3)
3. 监控与日志
- 配置Nginx和Tomcat的日志分割(按天/大小)
- 部署监控工具:Prometheus+Grafana监控服务器性能、Tomcat JVM指标
- 配置日志收集:使用ELK Stack(Elasticsearch+Logstash+Kibana)集中管理日志
🎯 常见问题排查
- 502 Bad Gateway:检查Tomcat是否启动、端口是否开放、防火墙规则
- 404 Not Found:确认项目已部署到Tomcat的webapps目录,上下文路径配置正确
- 性能瓶颈:使用
top、jstat、nginx -V分析CPU/内存/线程占用 - 会话共享:集群场景下需配置Redis或Memcached实现session共享(Tomcat的PersistentManager)