宝塔面板默认不支持jsp,因网站功能专为php/python等设计,nginx不解析.jsp文件;必须手动配置tomcat+反向代理+动静分离,否则请求将404或源码下载。

宝塔面板默认不支持 JSP,必须手动接入 Tomcat 并配置 Nginx 反向代理 + 静动分离,否则直接访问 .jsp 文件只会被当作普通文本下载或 404。
为什么不能只装 Tomcat 就完事?
宝塔的「网站」功能本质是为 PHP/Python/Node 等服务设计的,它不会自动把 .jsp 请求转给 Tomcat。Nginx 默认不解析 JSP,也不认识 /*.jsp 路径——它只负责转发,而转发规则得你亲手写。
- 不配
proxy_pass:用户请求/login.jsp,Nginx 直接返回 404 或源码(取决于 MIME 类型) - 没加
location ~ \.jsp$这类精确匹配:正则优先级不够,可能被location /或静态规则吞掉 - 忽略
proxy_set_header:Tomcat 拿不到真实客户端 IP、协议、Host,request.getScheme()可能返回http即使你用 HTTPS 访问
Tomcat 必须监听非 8080 的端口?
不一定,但强烈建议改。宝塔默认会占用 80/443,而 8080 端口在部分云服务器(如阿里云、腾讯云)默认被安全组拦截,且容易和宝塔内置的 Java 插件冲突。更稳妥的做法是:
- 在 Tomcat 的
conf/server.xml中,把Connector port="8080"改成port="8081"(或其他未被占用端口) - 宝塔 → 安全 → 放行对应端口(如 8081),并确认
firewall-cmd或ufw没拦住 - 启动 Tomcat 后,用
curl http://127.0.0.1:8081在服务器本地验证是否通——这步跳过,90% 的“连不上”问题都卡在这
nginx.conf 里怎么写 proxy_pass 才不翻车?
关键不是加一行 proxy_pass,而是让这条规则精准生效、不被覆盖。进宝塔 → 网站 → 对应站点 → 配置文件,在 server 块内插入以下内容(位置很重要):
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8081;
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_redirect off;
}
- 必须用
~ \.jsp$(结尾锚定),不能写成~ \.jsp,否则会匹配/login.jsp?v=1以外的路径,比如/login.jsp.bak -
proxy_pass后面不能带路径(如http://127.0.0.1:8081/结尾的/会触发重写,导致 Tomcat 找不到上下文) - 如果 Tomcat 部署了具体项目(如
/myapp),应在proxy_pass后补全上下文:proxy_pass http://127.0.0.1:8081/myapp;(注意结尾分号前无斜杠)
动静分离后 JSP 页面里的 CSS/JS 为啥 404?
因为 JSP 渲染出的 HTML 里写了 <link href="/css/app.css">,而这个请求没走 Tomcat,得由 Nginx 直接响应——但你没告诉 Nginx 哪儿找这些文件。
- 静态资源若放在 Tomcat 的
webapps/myapp/css/下,Nginx 无法直读,必须复制到 Nginx 的 root 目录(如/www/wwwroot/example.com/css/) - 然后加一条静态规则(放 JSP 规则上方!):
location ^~ /css/ { alias /www/wwwroot/example.com/css/; } - 或者统一用扩展名匹配:
location ~* \.(js|css|png|jpg|gif|woff2|ttf)$ { expires 1y; add_header Cache-Control "public, immutable"; },但前提是这些文件真在 Nginx 的root路径下 - 切记:JSP 里引用静态资源时,路径要跟 Nginx 的
location前缀对齐,比如用了^~ /static/,那 HTML 就得写/static/app.js
最易忽略的一点:改完配置后,必须点宝塔右上角「重载 Nginx」,而不是只点「保存」;且别忘了在终端执行 nginx -t 校验语法——多一个空格或少个分号,整个 server 块就失效。











