项目场景:
用户反馈软件突然无法登陆,显示404等登陆错误
基础信息:
- Tomcat 版本:Apache Tomcat/8.5.70
- OS:CentOS7(Linux 3.10.0‑1160.el7.x86_64)
- JDK:1.8.0_202
核心现象:
登录 jsp 页面 404 Not Found,不是账号密码错误,是页面资源根本访问不到。 ⚠️404 代表:Tomcat 收到请求,但是找不到对应的文件资源;不是 500(程序异常)、也不是 401/403 权限拒绝。
原因分析:
结合场景,未发布新程序,未做系统维护,仅做服务器升级迁移后出现登录页面 404
关键点 :旧环境完全正常,没有改 war 包、没有版本更新,只是迁移升级服务器,出现
/xxx/xxx/common/login.jsp 404war 包本身文件内容没有变,问题集中在迁移后的环境差异,不是程序代码本身 bug。
- 迁移后 webapps 目录解压不完整:war 自动解压失败,部分 jsp 文件丢失(最高概率) Tomcat 启动日志虽然打印
Deploying web application archive [/datum/tomcat/webapps/jxxsyy.war] has finished in [394] ms,但迁移后文件权限、属主问题,导致 war 解压的时候,只解压部分目录,jsp 这类小文件直接丢了。现象:webapps/jsyy 目录存在,但是子目录jsp/common/缺失或者里面没有 login.jsp,war 包本身是完整的。 - 文件 / 目录属主、权限不对,tomcat 进程无法读取 jsp 源文件 迁移拷贝数据的时候,文件属主变成 root,tomcat 运行用户(一般 tomcat)读不到 jsp 文件,Tomcat 表现为 404(不是 403)。CentOS7 环境迁移拷贝非常容易出现这个坑。
- 迁移后 tomcat 工作目录、CATALINA_BASE 环境不一致 旧环境和新迁移环境 tomcat 路径不一样,拷贝 webapps 的时候没有完整拷贝,或者只拷贝 war,没有拷贝解压后的文件夹。
- SELinux 开启,阻止 tomcat 读取 webapps 下面的 jsp 文件 CentOS7 升级迁移后默认 SELinux 开启,文件上下文不对,会出现能识别 war 部署,但是部分文件访问 404。
解决方案:
# 停止tomcat systemctl stop tomcat # 删除残缺解压目录,保留war包!!不要删除jxxsyy.war rm -rf /datum/tomcat/webapps/jxxsyy # 清理tomcat缓存,迁移后缓存残留也会导致404 rm -rf /datum/tomcat/work/* rm -rf /datum/tomcat/temp/* # 启动tomcat systemctl start tomcat # 查看启动状态 systemctl status tomcat curl -i http://127.0.0.1:8080/jxxsyy/jsp/common/login.jsp