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,出问题权限一堆。