当前位置: 首页 > news >正文

Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固

(一)容量规划 6 条
军规 1:线程池公式
maxThreads = ((并发峰值 × 平均 RT) / 1000) + 冗余 20 %;
踩坑:压测 2000 QPS、RT 200 ms,理论 maxThreads=500,线上却设 150 导致排队。

军规 2:Connector 选择
• CPU < 4 核且短连接 → BIO(已废弃)。
• 长连接、静态文件多 → NIO。
• TLS 高并发 → NIO + JSSE 或 APR + OpenSSL。

军规 3:内存预算
Heap = (并发请求数 × 平均对象大小 × 平均存活时间) / 2 + 峰值 Session 内存 + 50 % 安全垫。

军规 4:Session 总数上限
maxActiveSessions=10000,超出后触发 LRU 驱逐,防止 Map 膨胀。

军规 5:静态资源分离
Tomcat 只跑动态,静态用 Nginx + CDN,CPU 下降 40 %。

军规 6:容器启动时间
SpringBoot FatJar 内嵌 Tomcat 12 s;外置 Tomcat + war 25 s;通过 jlink 裁剪模块可降到 8 s。

(二)JVM 调优 7 条
军规 7:G1 优于 Parallel
-XX:+UseG1GC -XX:MaxGCPauseMillis=200,Full GC 次数从 5 次/天降到 0。

军规 8:Metaspace 初始值
-XX:MetaspaceSize=256m,防止启动期频繁 Full GC。

军规 9:关闭显式 GC
-XX:+DisableExplicitGC,防止 RMI 定时触发 System.gc()。

军规 10:JMX 安全
-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=true。

军规 11:GC Log 轮转
-Xlog:gc*:file=/opt/logs/gc-%t.log:time,uptime:filecount=10,filesize=100M

军规 12:OOM 自动 dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump

军规 13:容器感知
-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0

(三)线程与连接池 7 条
军规 14:acceptorThreadCount=2 只在多核且 TLS 握手重 CPU 场景生效。

军规 15:maxConnections 与 maxThreads 解耦
NIO 模式下 maxConnections=10000,maxThreads=200,防止 C10K 问题。

军规 16:禁用 BIO
protocol="org.apache.coyote.http11.Http11NioProtocol" 显式声明,避免老版本默认 BIO。

军规 17:Executor 共享
<Service name="Catalina">

军规 18:StuckThreadDetectionValve
threshold=600,报警线程栈。

军规 19:AsyncTimeout
NIO 模式下,异步 Servlet 默认 30 s 超时,可在 web.xml 覆盖。

军规 20:禁用 AJP
protocol="AJP/1.3" 如无反向代理,关闭端口 8009,防止 Ghostcat。

(四)日志与监控 6 条
军规 21:AccessLogValve 格式
%{X-Forwarded-For}i %l %u %t "%r" %s %b %D,%D 记录微秒级耗时。

军规 22:RollingFileAppender
maxDays=7,防止磁盘爆。

军规 23:Prometheus JMX Exporter
/opt/jmx_exporter/config.yml 暴露 tomcat_threadpool_currentThreadsBusy 等指标。

军规 24:Grafana Dashboard
线程、Session、GC、响应码 4 个维度,P95 响应时间告警阈值 1 s。

军规 25:慢查询定位
jstack 采样 + Arthas trace javax.servlet.http.HttpServlet service 定位 SQL。

军规 26:错误页面自定义
web.xml 配置 <error-page>

(五)安全加固 7 条
军规 27:删除默认应用
webapps/docs、examples、ROOT、manager 全干掉。

军规 28:关闭自动部署
<Host autoDeploy="false" deployOnStartup="false">

军规 29:隐藏版本号
Server=" " 或自定义字符串,防止扫描。

军规 30:启用 HTTPS
<Connector SSLEnabled="true" sslProtocol="TLS" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256...">

军规 31:SameSite Cookie
<Context useHttpOnly="true" sameSiteCookies="strict">

军规 32:SecurityListener
<Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="tomcat" />

军规 33:文件上传大小
<maxSwallowSize> 改为 10 MB,防止大文件占满磁盘。

(六)故障演练 7 条
军规 34:kill -3 模拟 Full GC 卡顿,验证 HPA 是否及时扩容。
军规 35:iptables -A INPUT -p tcp --dport 8080 -j DROP 模拟网络分区,哨兵探测到后是否切流。
军规 36:echo 3 > /proc/sys/vm/drop_caches 触发缓存失效,观察 RT 抖动。
军规 37:jmap -histo:live 查看 Session 对象是否泄漏。
军规 38:Arthas ognl 改 SystemProperty 做动态开关演练。
军规 39:磁盘写满 touch bigfile,验证 AccessLogValve 是否阻塞线程。
军规 40:Chaos Mesh 注入 Pod CPU 100 %,验证 readinessProbe 摘除流量。

(七)云原生与 CI/CD 7 条
军规 41:Dockerfile 用 distroless/java17-base,镜像 60 MB → 40 MB。
军规 42:非 root 运行
RUN addgroup -g 1000 tomcat && adduser -D -s /bin/sh -u 1000 -G tomcat tomcat。

军规 43:分层构建
依赖层 COPY pom.xml 单独缓存,代码变更后 5 s 构建完成。

军规 44:Helm Chart
values.yaml 暴露 replicaCount、resources、jvmOpts,支持多环境。

军规 45:优雅停机脚本
preStop: /bin/sh -c "sleep 15 && catalina.sh stop" 让正在处理的请求完成。

军规 46:HPA 双指标
cpuUtilization=60% + tomcat_threadpool_currentThreadsBusy>80% 并发。

军规 47:Keda 基于 Kafka 消息积压自动扩容 Tomcat Pod。


结语
40 条军规是 50 台 Tomcat、200 次故障、3 个 P1 事故后的复盘。请把这份清单贴在 wiki 首页,下次事故来临前,你已经把风险提前清零。

http://www.dtcms.com/a/287922.html

相关文章:

  • Linux Ubuntu安装教程|附安装文件➕安装教程
  • 尚庭公寓-----day2 业务功能实现
  • PHP 就业核心技能速查手册
  • Delphi XE 自带了 Base64编码解码
  • 前端知识回顾-登录界面
  • 从“数字土著”到“数据公民”:K-12数据伦理课程的设计、实施与成效追踪研究
  • 开启你的专属智能时代:枫清科技个人智能体限时体验计划上线!
  • 简单易懂,段页式管理
  • 【leetcode100】寻找重复数
  • Codeforces Round 1037 (Div. 3)(补题)
  • 数据结构与算法之美:拓扑排序
  • Kimi K2 日调用量超100亿 token,API 价格低于 Claude 系列模型
  • 正则表达式概述
  • 垃圾回收(GC)
  • 机器学习漫画小抄 - 彩图版
  • Linux内核设计与实现 - 第6章 内核数据结构
  • 编程思想:程序自身的模型/函数模型硬件标准如何实现
  • MCP 协议分析 二 Sampling
  • synchronized锁升级机制
  • 100条常用SQL语句
  • Spring AI 1.0版本 + 千问大模型之文本对话
  • ReentrantLock和synchronized的区别
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-133节(SQL——DQL——基础查询)
  • 解决Maven版本不兼容问题的终极方案
  • 操作系统1.1.1+1.1.2:操作系统的概念、功能
  • 软考高级之工程工期成本计算题
  • 神经网络:从模式组合到多层神经网络的进化
  • 自由学习记录(70)
  • Java程序猿搬砖笔记(十九)
  • 零基础 “入坑” Java--- 十二、抽象类和接口