这是 middleware/tomcat.md 的每次改动内容,按时间从新到旧。其他文章一起提交的部分不会出现在这里。
#1
2026-10-18
+71
−0
docs: 新增存储/中间件/自动化/云与K8s/证书/流程 6 个分类和 16 篇文章
e4d2cd0
new file mode 100644
@@ -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,出问题权限一堆。