0aa8fe6
这次没有正文改动。
这是 middleware/Tomcat 部署与 JVM 参数.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
e4d2cd0
@@ -0,0 +1,71 @@ +--- +tags: [Tomcat, Java, 中间件] +order: 20 +--- + +# Tomcat 部署与 JVM 参数 + +## 场景 + +要跑一个 Java Web 应用(war 包),需要配好 JDK、堆内存和端口。 + +## 前置条件 + +- 装好对应版本的 JDK +- 应用需要的端口(默认 8080) +- 知道应用大概的内存需求 + +## 配置 + +```bash +# 下载解压 +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/ +``` + +## 验证 + +```bash +ss -lntp | grep 8080 +curl -I http://127.0.0.1:8080/app/ +tail -f /opt/tomcat/logs/catalina.out +``` + +看是否 OOM: + +```bash +grep -i "outofmemory" /opt/tomcat/logs/catalina.out +jstat -gc <pid> 1000 5 +``` + +## 回滚 + +```bash +rm -rf /opt/tomcat/webapps/app +# 或者换回上一个 war +``` + +## 坑 + +- **`-Xmx` 设得比物理内存还大**,容器或系统会先被 OOM killer 干掉。 +- 时区不设,日志时间差 8 小时。 +- 编码不设 UTF-8,中文参数乱码。 +- war 包名决定访问路径,改名等于改 URL。 +- `catalina.out` 不会自动切割,一个月能到几十 G。 +- 用 root 跑 tomcat,出问题权限一堆。