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 时,按顺序检查:

  1. Tomcat 是否在运行:ps -ef | grep tomcat。
  2. 8080 端口是否监听:ss -lntp | grep 8080。
  3. Nginx 错误日志:tail -f /var/log/nginx/error.log,常见提示是 connect() failed (111: Connection refused),说明 Nginx 连不上 Tomcat。
  4. 如果 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 都能定位到具体环节。

分享到:
上一篇
Tomcat性能优化:从JVM到连接器的调优指南
下一篇
MySQL主从复制配置全流程:从零搭建到状态验证
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意