Oamc

Tomcat 部署与 JVM 参数

本页目录

场景

要跑一个 Java Web 应用(war 包),需要配好 JDK、堆内存和端口。

前置条件

  • 装好对应版本的 JDK
  • 应用需要的端口(默认 8080)
  • 知道应用大概的内存需求

配置

# 下载解压
tar xzf apache-tomcat-9.0.x.tar.gz -C /opt
ln -s /opt/apache-tomcat-9.0.x /opt/tomcat

# 用独立用户跑
useradd -r -s /usr/sbin/nologin tomcat
chown -R tomcat:tomcat /opt/apache-tomcat-9.0.x

# JVM 参数
cat >/opt/tomcat/bin/setenv.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export CATALINA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC \
  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/dumps \
  -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
EOF
chmod +x /opt/tomcat/bin/setenv.sh

# 部署
cp app.war /opt/tomcat/webapps/

验证

ss -lntp | grep 8080
curl -I http://127.0.0.1:8080/app/
tail -f /opt/tomcat/logs/catalina.out

看是否 OOM:

grep -i "outofmemory" /opt/tomcat/logs/catalina.out
jstat -gc <pid> 1000 5

回滚

rm -rf /opt/tomcat/webapps/app
# 或者换回上一个 war

坑

  • -Xmx 设得比物理内存还大,容器或系统会先被 OOM killer 干掉。
  • 时区不设,日志时间差 8 小时。
  • 编码不设 UTF-8,中文参数乱码。
  • war 包名决定访问路径,改名等于改 URL。
  • catalina.out 不会自动切割,一个月能到几十 G。
  • 用 root 跑 tomcat,出问题权限一堆。