我首先在 StackOverflow 上询问了这个问题,但似乎这个网站更适合。
我正在设置一个 Web 应用环境来运行 Java 应用。该环境应该是:
- AWS EC2 Ubuntu 18
- Java 8
- Tomcat 9
我启动了一个 EC2 实例并安装了 java,然后按照本指南设置 Tomcat: https://www.digitalocean.com/community/tutorials/install-tomcat-9-ubuntu-1804
现在,尝试启动/重新启动 Tomcat 服务时会出现问题systemctl
。这是我在检查 systemctl 日志时看到的内容:
12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: tomcat.service: 服务延迟时间已过,正在安排重新启动。 12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: tomcat.service: 计划重启作业,重启计数器为 5。 12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: 已停止 Apache Tomcat Web 应用程序容器。 12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: 正在启动 Apache Tomcat Web 应用程序容器... 12月19日 13:35:25 ip-10-165-10-74 startup.sh[1705]: Tomcat 已启动。 12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]:已启动 Apache Tomcat Web 应用程序容器。 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 2018 年 12 月 19 日下午 1:35:26 org.apache.catalina.startup.Catalina stopServer 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 严重:无法连接 [localhost:8005] (基本端口 [8005] 和偏移量 [0])。Tomcat 可能未运行。 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 2018 年 12 月 19 日下午 1:35:26 org.apache.catalina.startup.Catalina stopServer 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 严重:停止 Catalina 时出错 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: java.net.ConnectException: 连接被拒绝 (连接被拒绝) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.PlainSocketImpl.socketConnect(Native Method) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket.connect(Socket.java:589) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket.connect(Socket.java:538) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket。(Socket.java:434) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket。(Socket.java:211) 12月19日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Catalina.stopServer(Catalina.java:513) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.lang.reflect.Method.invoke(Method.java:498) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:403) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:497) 12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 停止命令失败。尝试通过 OS 信号发出停止进程的信号。 12月19日 13:35:27 ip-10-165-10-74 shutdown.sh[1725]: Tomcat 已停止。
systemd 配置:
[单元] 描述=Apache Tomcat Web 应用程序容器 之后=网络.目标 [服务] 类型=分叉 环境=JAVA_HOME=/usr/lib/java/jdk1.8.0_191 环境=CATALINA_PID=/opt/tomcat/temp/tomcat.pid 环境=CATALINA_HOME=/opt/tomcat 环境=CATALINA_BASE=/opt/tomcat 环境='CATALINA_OPTS=-Xms256M -Xmx512M -server -XX:+UseParallelGC' 环境='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom' ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh 用户=tomcat 组=tomcat 掩码=0007 重启安全=10 重启=总是 [安装] WantedBy=多用户.目标
据我了解,这里的问题是 Tomcat 无法连接到 8005 端口来监听关机命令。
但是,我在EC2安全组控制台中打开了这个端口:
8005 127.0.0.1/32
另一件奇怪的事情是,重新启动 ec2 实例时 Tomcat 启动正常,但无法重新启动并抛出如上所述的异常。
这里可能存在什么问题?如何检查端口 8005 是否确实打开?
===========
好吧,我取得了一些进展,我发现 Tomcat 似乎运行良好。startup.sh
运行正常 - 您可能会在日志中看到这一点 - 它回显“Tomcat 已启动”。这是 中的最后一行catalina.sh start
。但是,我不明白为什么systemctl
在启动服务后立即尝试停止服务。它发送catalina.sh stop
命令。
答案1
感谢@MichaelHampton 的精彩文章: https://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html
它解释了我读过的教程(以及大量其他复制粘贴的教程)中建议的典型安装可能出现的问题。我无法弄清楚问题出现的原因。也许是 catalina.sh、startup.sh 等引入的所有层的问题。
所以基本上,我重写了 systemd 配置脚本并且它开始工作了。
答案2
我遇到了完全相同的问题。只是我使用的是 Amazon Lightsail。也许 Amazon 配置其 Ubuntu 机器的方式以及所述创建 Tomcat 服务的方式存在问题。我在自己设置的本地 Ubuntu 机器上使用所述方式,并且运行良好。
我读了 @michael-hampton 的文章,并使用了那里描述的方法。我是一个 Linux 新手,我发现在使用它时遇到了一些问题。我在这里包含了我最终得到的文件,这样其他遇到此问题的 Linux 新手可能会更容易上手。我的 Tomcat 安装在 /opt/tomcat,这些是我最终得到的文件:
/etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
User=tomcat
Group=tomcat
UMask=0007
EnvironmentFile=/etc/default/tomcat
ExecStart=/usr/bin/env ${JAVA_HOME}/bin/java \
$JAVA_OPTS $CATALINA_OPTS \
-classpath ${CLASSPATH} \
-Dcatalina.base=${CATALINA_BASE} \
-Dcatalina.home=${CATALINA_HOME} \
-Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS} \
-Djava.io.tmpdir=${CATALINA_TMPDIR} \
-Djava.util.logging.config.file=${CATALINA_BASE}/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap \
start
ExecStop=/usr/bin/env ${JAVA_HOME}/bin/java \
$JAVA_OPTS $CATALINA_OPTS \
-classpath ${CLASSPATH} \
-Dcatalina.base=${CATALINA_BASE} \
-Dcatalina.home=${CATALINA_HOME} \
-Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS} \
-Djava.io.tmpdir=${CATALINA_TMPDIR} \
-Djava.util.logging.config.file=${CATALINA_BASE}/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap \
stop
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
在 /etc/default/tomcat 中
CATALINA_HOME=/opt/tomcat
CATALINA_BASE=/opt/tomcat
CATALINA_TMPDIR=/opt/tomcat/temp
CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC
JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom
JAVA_ENDORSED_DIRS=/opt/tomcat/endorsed
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
CLASSPATH=/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
答案3
看起来这是由于 Tomcat 的“最近”版本中引入的一个错误造成的。请查看此答案:https://stackoverflow.com/a/54452870/4735682,因为它指向正确的错误报告。
Tomcat 的最新版本没有这个错误,因此更新应该可以解决您的问题,而无需摆弄 systemd 单元文件。