Tomcat与Nginx整合实战:反向代理配置与常见报错处理
Tomcat 与 Nginx 整合的核心目的,是让 Nginx 作为外部入口处理静态资源和请求转发,Tomcat 只负责运行 Java 应用。
这样做的直接好处是静态文件响应更快、HTTPS 和域名管理更集中,同时避免把 Tomcat 的 8080 端口直接暴露到公网。
如果你已经能单独访问 Tomcat 应用,但希望用域名加 80 或 443 端口对外服务,或者遇到静态资源加载慢、并发上不去的情况,可以按下面的步骤完成整合。
先确认环境是否满足整合条件
整合前不需要重装 Tomcat,但需要确认几个基础条件。
- 操作系统:常见 Linux 发行版均可,示例路径以
/usr/local/nginx和/usr/local/tomcat为准,实际以你的安装位置替换。 - Nginx 已安装并能正常启动,执行
nginx -v能看到版本号。 - Tomcat 已安装并能通过
http://服务器IP:8080访问到默认页或你的应用。 - 服务器安全组或防火墙已放行 80、443 端口;Tomcat 的 8080 端口可以只对本机开放。
- 如果使用域名,DNS 已解析到服务器公网 IP。
先验证 Tomcat 本身是否正常,可以执行:
curl -I http://127.0.0.1:8080/
返回 HTTP/1.1 200 或 302 说明 Tomcat 在监听。
如果这一步失败,先解决 Tomcat 启动问题,不要急着改 Nginx。
配置 Nginx 反向代理到 Tomcat
Nginx 的站点配置通常放在 /etc/nginx/conf.d/ 或 /usr/local/nginx/conf/ 下。
新建一个配置文件,例如 tomcat.conf,写入以下内容:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1: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_set_header X-Forwarded-Proto $scheme;
}
}
几个关键点需要理解:
proxy_pass指向 Tomcat 的监听地址,如果 Tomcat 和 Nginx 在同一台机器,用127.0.0.1:8080即可。Host头要传给 Tomcat,否则应用生成的链接可能变成127.0.0.1。X-Real-IP和X-Forwarded-For用于让 Tomcat 获取真实客户端 IP,日志和风控会用到。
保存后先检查配置语法:
nginx -t
看到 syntax is ok 和 test is successful 再重载:
nginx -s reload
此时用浏览器访问 http://your-domain.com,如果能看到和 8080 端口一致的内容,说明反向代理已经生效。
静态资源分离要不要做
很多教程会建议把图片、CSS、JS 交给 Nginx 直接返回,Tomcat 只处理动态请求。
这个思路本身没问题,但要注意路径是否真实存在。
如果应用打包后静态文件在 Tomcat 的 webapps/ROOT/static 目录,可以在 Nginx 里加一个 location:
location /static/ {
root /usr/local/tomcat/webapps/ROOT;
expires 7d;
}
这样访问 /static/logo.png 时,
Nginx 会直接读取 /usr/local/tomcat/webapps/ROOT/static/logo.png,
不再转发给 Tomcat。
需要避开的坑:
root和alias含义不同,写错会导致 404。root会拼接 location 后面的路径,alias会替换掉 location 路径。- 静态目录权限要允许 Nginx 工作进程读取,否则会返回 403。
- 如果应用使用了带版本号或哈希的文件名,缓存时间可以设长一些;否则不要盲目设置过长缓存,避免更新后用户拿到旧文件。
502 和 404 报错怎么排查
整合后最常见的问题是 502 Bad Gateway 和 404 Not Found,两者原因不同。
出现 502 时,按顺序检查:
- Tomcat 是否在运行:
ps -ef | grep tomcat。 - 8080 端口是否监听:
ss -lntp | grep 8080。 - Nginx 错误日志:
tail -f /var/log/nginx/error.log,常见提示是connect() failed (111: Connection refused),说明 Nginx 连不上 Tomcat。 - 如果 Tomcat 启动很慢,Nginx 超时时间可能不够,可以在 location 中加
proxy_read_timeout 60s;。
出现 404 时,重点看请求路径是否被正确转发:
- 在 Nginx 配置中临时加
access_log观察实际请求 URI。 - 确认 Tomcat 应用的 context path 是否和访问路径一致。例如应用部署为
webapps/myapp,访问根路径就会 404。 - 如果用了
proxy_pass http://127.0.0.1:8080/;,注意末尾斜杠会改变路径拼接方式,去掉或保留斜杠要前后统一。
整合完成后的验证清单
配置完成后不要只看首页是否能打开,建议按下面几项确认:
- 用
curl -I http://your-domain.com看到 200 或 302,且响应头来自 Nginx。 - 在 Tomcat 访问日志中能看到来自 Nginx 的请求,且客户端 IP 不是
127.0.0.1。 - 静态资源返回
Content-Type正确,没有变成text/html。 - 重启服务器后 Nginx 和 Tomcat 能自动恢复,或者你已经配置了开机启动。
如果后续要上 HTTPS,可以在 Nginx 这一层配置证书,Tomcat 继续用 HTTP 对内服务,这样证书只需要维护一份。
常见疑问
Tomcat 和 Nginx 必须装在同一台服务器吗?
不是必须。Nginx 可以通过内网 IP 或另一台服务器的地址转发到 Tomcat,只要网络连通且端口可达即可。同机部署配置更简单,分离部署更适合按层扩展。
整合后 Tomcat 的 8080 端口还要对外开放吗?
通常不需要。把 8080 限制为只允许本机或内网访问,可以减少直接暴露应用服务器的风险。如果外部无法访问 8080,但域名能正常打开,说明反向代理已经生效。
修改 Nginx 配置后需要重启 Tomcat 吗?
不需要。Nginx 配置变更用 nginx -t 检查后 nginx -s reload 即可。只有修改 Tomcat 的 server.xml 或应用本身时才需要重启 Tomcat。
整体来看,Tomcat 与 Nginx 整合的关键不在于配置多复杂,而在于每一步都能验证:Tomcat 能独立访问、Nginx 语法正确、转发后首页可打开、日志里能看到真实请求。
按这个顺序操作,大多数 502 和 404 都能定位到具体环节。