|
昨天下午,网站一个做外贸的网站朋友发来截图,说客户反馈公司官网打不开。网站我点开链接一看,网站地址栏里明晃晃挂着.jsp后缀。网站浏览器转了两圈,网站直接甩出502。网站这不是网站他一家的问题——最近三个月,我至少碰到七八个类似案例,网站全是网站JSP页面突然罢工。 JSP这东西,网站说白了就是网站Java跑在服务器上生成网页。它不像静态HTML那样扔进浏览器就能看,网站得靠Tomcat、网站Jetty这类容器翻译成Servlet再执行。网站打不开的原因,八成出在服务端,跟你本地网络没半毛钱关系。我见过最离谱的一次,运维把Tomcat的web.xml里jsp的servlet-mapping注释掉了,结果全站JSP直接404,页面白得像张纸。 具体到报错,得看浏览器给你什么脸色。502 Bad Gateway,通常是Nginx转发给Tomcat时,Tomcat已经挂了或者端口没监听。504 Gateway Timeout,说明Tomcat还活着,但JSP编译卡死了——比如某个页面里嵌了段死循环,或者连数据库超时没设上限。要是直接弹500,那得翻Tomcat的logs/catalina.out,十有八九是NullPointerException,某个request.getParameter()没做空判断。 有个细节很多人忽略:JSP第一次访问会触发编译。如果服务器刚重启,第一个请求要等好几秒,浏览器可能提前超时。我那个外贸朋友就是这情况——他重启完服务器,自己刷页面觉得“秒开”,因为已经编译过了。客户那边第一次点,转圈转到怀疑人生,最后报504。后来在web.xml里配了jsp-config预编译,问题才消停。 再说个真事。上个月帮人排查一个政府老系统,JSP页面死活打不开,报java.lang.OutOfMemoryError: PermGen space。这错现在少见,因为JDK8以后PermGen被Metaspace取代了。但那台服务器跑的是JDK7,JSP反复编译把永久代撑爆了。重启能顶一阵,过两天又炸。最后加了-XX:MaxPermSize=256m才稳住。这种老古董,你拿新版本文档去对,根本对不上号。 还有种情况挺气人:页面能打开,但样式全乱,JS报错。你以为是JSP没执行?其实执行了,只是out.println输出的HTML里,某个引号没转义,把标签截断了。这种bug在JSP里特别常见,因为<% %>和<%= %>混着写,眼睛一花就漏了闭合。我习惯用jsp:include代替<%@ include %>,至少编译期能抓出语法错。 排查顺序别搞反。先看Tomcat进程在不在,ps -ef | grep tomcat。在的话,netstat -tlnp | grep 8080看端口。端口通,直接curl -v http://localhost:8080/你的页面.jsp,把浏览器和网络层全绕过去。如果curl返回正常,那就是Nginx或防火墙的锅;如果curl也报错,盯着Tomcat日志看,别瞎猜。我见过有人折腾一下午Nginx配置,最后发现是Tomcat的work目录权限不对,JSP编译写不进去。 最后说句实在的,2024年了,新项目真没必要上JSP。前后端分离,后端吐JSON,前端Vue/React接,部署简单,调试直观。但老系统维护,该啃还得啃。打不开的时候,别急着重启,先看日志——那里面写的比任何教程都准。 |