启动 Tomcat 并摸清结构
目标
在没有 systemd 的情况下启动和停止 Tomcat,掌握目录结构和监听端口,
通过 setenv.sh 注入 JVM 选项,并能够在进程中确认这些选项是否真正生效。
为什么重要
SI 现场的服务器常常是解压厂商提供的 tar.gz 直接使用,而容器环境中
没有 systemd。所以能够直接操作 catalina.sh 是一项基本功。
还有一点——“进程在运行,但端口没有打开”的状态是真实存在的。
端口冲突或连接器初始化失败时就是这样。通过日志和端口而不是进程来确认启动,
这个习惯会在本实验中养成。
步骤
- 创建
/root/tc目录,并将java -version的输出保存到/root/tc/java.txt。 (必须包含标准错误。) - 创建
/root/tc/layout.csv。首行为dir,purpose。 必须有bin、conf、lib、logs、webapps、work、temp这七行, 每行的purpose至少 8 个字符。 - 用
/opt/tomcat/bin/catalina.sh start启动 Tomcat。http://127.0.0.1:8080/必须返回 HTTP 200。 - 在
/opt/tomcat/logs/catalina.out中找到启动耗时(毫秒), 将仅数字保存到/root/tc/startup.txt。 - 在当前处于 LISTEN 状态的端口中,找出 Tomcat 打开的端口,
按升序、每行一个保存到
/root/tc/ports.txt。 - 创建
/opt/tomcat/webapps/hello/index.html,并在正文中写入LabHub字符串。http://127.0.0.1:8080/hello/必须返回 200,且正文中包含LabHub。 - 停止 Tomcat 后再重新启动。
(先执行
catalina.sh stop 30 -force,再执行catalina.sh start) 重启后http://127.0.0.1:8080/hello/也必须返回 200。 - 创建
/opt/tomcat/bin/setenv.sh,把下面的选项定义为CATALINA_OPTS, 然后重启。-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dump也请提前创建好/root/tc/dump目录。 正在运行的 Java 进程的参数中必须实际看到这些选项,才算通过。
参考
java -version 2> /root/tc/java.txt—— 版本信息是输出到标准错误的。- 用
ss -ltn查看 LISTEN 端口。用grep、awk -F:只提取端口。 - 确认运行中的 JVM 参数:
ps -ef | grep java或tr '\0' ' ' < /proc/<PID>/cmdline - 常见错误 1:启动后立刻
curl而失败。请等几秒钟或重试。 - 常见错误 2:创建了
setenv.sh却没有重启,导致选项没有生效。 - 常见错误 3:在
setenv.sh中使用JAVA_OPTS=而不是CATALINA_OPTS=。 两者都能生效,但JAVA_OPTS在stop时也会生效,而CATALINA_OPTS只 在启动时生效。堆选项应当使用CATALINA_OPTS。
确认 JDK 版本
创建 /root/tc 目录,并将 java -version 的输出保存到 /root/tc/java.txt。
(必须包含标准错误。)
java -version 的输出走的是标准错误。要保存到文件,请注意重定向。
整理目录的作用
创建 /root/tc/layout.csv。首行为 dir,purpose。
必须有 bin、conf、lib、logs、webapps、work、temp 这七行,
每行的 purpose 至少 8 个字符。
用一行文字写出每个目录存放什么。请区分 work 和 temp 的差别,以及 lib 和 webapps/*/WEB-INF/lib 的差别。
启动 Tomcat
用 /opt/tomcat/bin/catalina.sh start 启动 Tomcat。
http://127.0.0.1:8080/ 必须返回 HTTP 200。
这个环境中没有 systemctl。请直接运行 bin 目录下的启动脚本。启动是异步的,立刻 curl 可能会失败。
确认启动耗时
在 /opt/tomcat/logs/catalina.out 中找到启动耗时(毫秒),
将仅数字保存到 /root/tc/startup.txt。
catalina.out 中会留下形如“Server startup in [N] milliseconds”的一行。只需提取数字,所以请在 grep 之后接上 sed 或 awk。
确认监听端口
在当前处于 LISTEN 状态的端口中,找出 Tomcat 打开的端口,
按升序、每行一个保存到 /root/tc/ports.txt。
用 ss -ltn 查看当前处于 LISTEN 状态的端口。除了服务端口之外,应该还有一个端口是打开的,弄清楚它是什么,就是这一步的关键。
部署静态上下文
创建 /opt/tomcat/webapps/hello/index.html,并在正文中写入 LabHub 字符串。
http://127.0.0.1:8080/hello/ 必须返回 200,且正文中包含 LabHub。
在 webapps 下创建目录后,该目录名就成为上下文路径。不需要 WAR 也可以部署。
停止后重启
停止 Tomcat 后再重新启动。
(先执行 catalina.sh stop 30 -force,再执行 catalina.sh start)
重启后 http://127.0.0.1:8080/hello/ 也必须返回 200。
请养成给停止脚本指定等待时间和 -force 的习惯。重启是否真的发生,可以通过 catalina.out 中启动日志的数量来确认。
通过 setenv.sh 注入 JVM 选项
创建 /opt/tomcat/bin/setenv.sh,把下面的选项定义为 CATALINA_OPTS,
然后重启。
-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dump
也请提前创建好 /root/tc/dump 目录。
正在运行的 Java 进程的参数中必须实际看到这些选项,才算通过。
直接修改 catalina.sh,Tomcat 升级时就会丢失。请创建 bin/setenv.sh 并在其中定义 CATALINA_OPTS,且必须重启才能生效。是否真正生效,请通过进程的运行参数来确认。