Apache Tomcat搭配Nginx时.jsp文件被下载且Servlet请求报404
问题分析与解决方案
嘿,我看你这配置里的问题挺明显的,咱们一步步来拆解:
为什么JSP会触发下载?
你配置里的proxy_pass http://127.0.0.1:80写错端口啦!Tomcat默认监听的是8080端口,你现在把请求转发回了Nginx自己的80端口,等于Nginx根本没把JSP请求交给Tomcat去解析编译,直接把JSP原文件当静态资源扔给了浏览器——浏览器看不懂JSP代码,自然就触发下载操作了。
为什么Servlet请求返回404?
location /里的try_files $uri $uri/ =404规则是罪魁祸首。这条规则会让Nginx先检查请求的路径是不是服务器上真实存在的文件或目录,但Servlet的URL对应的是后端的Java类,不是真实的文件,所以Nginx找不到就直接返回404了,根本没把请求转发给Tomcat处理。
修改后的Nginx配置
直接给你改好的配置,关键改动我都标出来了:
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; # 注释掉原root配置,因为动态内容全由Tomcat处理,静态资源单独配置路径 # root /opt/apache-tomcat-8.0.46/webapps/app1; index index.jsp index.html index.htm; server_name mydomain.com www.mydomain.com; # 优先处理静态资源,Nginx直接返回,减轻Tomcat压力 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { # 这里指定静态资源的实际路径(Tomcat webapps下的对应目录) root /opt/apache-tomcat-8.0.46/webapps/app1; expires 1M; } # 所有动态请求(JSP、Servlet、接口等)全部转发给Tomcat location / { # 改成Tomcat的默认端口8080,如果你改了Tomcat端口请对应调整 proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # 删掉try_files!动态请求不是真实文件,不需要这条检查 # try_files $uri $uri/ =404; } }
关键改动说明
- 修正转发端口:把
proxy_pass的目标端口从80改成Tomcat的8080,确保动态请求能到Tomcat手里。 - 调整location顺序:先匹配静态资源,让Nginx直接返回静态文件,提升性能;剩下的所有请求都转发给Tomcat,覆盖JSP、Servlet等所有动态场景。
- 移除try_files规则:这条规则对动态请求完全不适用,删掉它才能让Servlet请求正常转发到Tomcat。
- 静态资源指定root:如果你的静态文件存在Tomcat的webapps目录下,必须在静态资源的location里指定root路径,Nginx才能找到这些文件。
改完配置后,重启Nginx生效:
sudo systemctl restart nginx
别忘了确认Tomcat正在运行,并且监听的是8080端口(可以去Tomcat的conf/server.xml里看Connector的端口配置)。
内容的提问来源于stack exchange,提问作者Samtech
相关产品推荐
相关产品推荐

