Ubuntu 22.04下Systemctl启动Tomcat部署WAR后无法访问问题
Tomcat 8.5在Ubuntu 22.04下systemctl启动异常问题排查与解决
问题现象
- 未部署WAR包时,
startup.sh和systemctl均可正常启动Tomcat并访问localhost:8080 - 部署应用WAR包后,
systemctl显示Tomcat处于active状态,但无法访问localhost:8080;手动执行startup.sh则可正常访问localhost:8080及localhost:8080/myapp - 日志差异:手动启动的
catalina.out包含Configuring Spring Security Core ... ... finished configuring Spring Security Core记录,systemctl启动时无该条目 - 已排除权限问题:执行
sudo -u tomcat bash -c '/opt/tomcat/bin/startup.sh'可正常启动并访问应用
当前systemd服务配置
[Unit] Description=Tomcat 8.5 After=syslog.target network.target [Service] Type=forking User=tomcat Group=tomcat Environment="JAVA_HOME=/home/myuser/.sdkman/candidates/java/8.0.282.hs-adpt" Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom" Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid" Environment="CATALINA_BASE=/opt/tomcat" Environment="CATALINA_HOME=/opt/tomcat" Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC" ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh #RestartSec=10 #Restart=always [Install] WantedBy=multi-user.target
journalctl错误日志
An ExecStart= process belonging to unit tomcat.service has exited. ░░░░ The process' exit code is 'exited' and its exit status is 1. Aug 21 14:44:49 myMachine systemd[1]: tomcat.service: Failed with result 'exit-code'. ░░ Subject: Unit failed ░░ Defined-By: systemd ░░ Support: http://www.ubuntu.com/support ░░░░ The unit tomcat.service has entered the 'failed' state with result 'exit-code'. Aug 21 14:44:49 myMachine systemd[1]: Failed to start Tomcat - instance . ░░ Subject: A start job for unit tomcat.service has failed ░░ Defined-By: systemd ░░ Support: http://www.ubuntu.com/support ░░░░ A start job for unit tomcat.service has finished with a failure. ░░░░ The job identifier is 14172 and the job result is failed.
解决方案
修改systemd服务配置
替换为以下配置:
[Unit] Description=Tomcat 8.5 After=syslog.target network.target [Service] Type=simple User=tomcat Group=tomcat # 改用系统级JDK路径,确保tomcat用户可访问 Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom" Environment="CATALINA_BASE=/opt/tomcat" Environment="CATALINA_HOME=/opt/tomcat" Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC" # 直接运行catalina.sh而非startup.sh,避免fork进程导致systemd误判 ExecStart=/opt/tomcat/bin/catalina.sh run ExecStop=/opt/tomcat/bin/shutdown.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
配置说明
- Type=simple:放弃forking模式,使用simple配合
catalina.sh run让Tomcat在前台运行,systemd能准确监控进程状态,避免误判服务启动完成。 - JAVA_HOME路径调整:原配置使用的sdkman路径属于myuser用户,tomcat用户可能无访问权限,改用系统级OpenJDK路径可避免权限问题,确保JDK正常加载。
- 启动命令修改:直接调用
catalina.sh run替代startup.sh,消除fork进程带来的状态检测问题,同时让systemd能捕获Tomcat的完整日志。
操作步骤
- 停止当前Tomcat服务:
sudo systemctl stop tomcat.service - 备份原服务文件:
sudo cp /etc/systemd/system/tomcat.service /etc/systemd/system/tomcat.service.bak - 替换为新的服务配置内容
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启动Tomcat服务:
sudo systemctl start tomcat.service - 查看服务状态:
sudo systemctl status tomcat.service
内容的提问来源于stack exchange,提问作者Amartya Sinha
相关产品推荐
相关产品推荐

