下面我将从核心配置文件、JVM 内存调优、连接器配置、部署配置、日志配置等多个方面,为你详细梳理 Linux 下 Tomcat 的参数配置。

核心配置文件
Tomcat 的行为主要由以下几个核心文件控制:
$CATALINA_HOME/bin/catalina.sh:Tomcat 的启动、停止和重启脚本,这是最重要的脚本,用于设置环境变量和启动参数。$CATALINA_HOME/conf/server.xml:Tomcat 的主配置文件,定义了服务器的核心组件,如端口、连接器、引擎、主机等。$CATALINA_HOME/conf/web.xml:Web 应用的部署描述符默认模板,所有部署到 Tomcat 的应用都会继承这些默认配置。$CATALINA_HOME/bin/setenv.sh:强烈推荐使用,这是一个自定义环境变量的脚本,catalina.sh在启动时会自动加载它,用于存放你自己的环境变量,避免直接修改catalina.sh。
JVM 内存与性能调优 (catalina.sh 和 setenv.sh)
JVM 参数是 Tomcat 性能优化的关键,这些参数通常在 catalina.sh 的 JAVA_OPTS 环境变量中设置。
最佳实践:使用 setenv.sh
为了避免升级 Tomcat 时覆盖你的修改,建议创建 setenv.sh 文件:
# 在 $CATALINA_HOME/bin/ 目录下创建 setenv.sh 文件 touch $CATALINA_HOME/bin/setenv.sh
然后在 setenv.sh 中添加你的 JVM 参数:

#!/bin/bash # $CATALINA_HOME/bin/setenv.sh # JVM 内存设置 export JAVA_OPTS="-Xms2g -Xmx2g -XX:NewRatio=1 -XX:SurvivorRatio=8" # GC 策略和日志 export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8" export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,gc+age=trace:file=/var/log/tomcat/gc.log:time,uptime,level:filecount=5,filesize=10M" # 元空间大小 (Java 8+) export JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m" # 其他优化 export JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true" export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
常用 JVM 参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
| 堆内存设置 | ||
-Xms |
JVM 初始堆内存大小,建议与 -Xmx 设置相同,以避免动态调整带来的性能开销。 |
-Xms2g (初始堆内存2GB) |
-Xmx |
JVM 最大堆内存大小,这是最重要的参数,根据服务器物理内存和应用需求设置。 | -Xmx2g (最大堆内存2GB) |
| 新生代与老年代比例 | ||
-XX:NewRatio |
新生代与老年代的内存比例。-XX:NewRatio=1 表示新生代和老年代各占堆内存的一半。 |
-XX:NewRatio=1 |
-XX:SurvivorRatio |
Eden 区与一个 Survivor 区的比例。-XX:SurvivorRatio=8 表示 Eden:Survivor = 8:1。 |
-XX:SurvivorRatio=8 |
| 垃圾回收器 | ||
-XX:+UseG1GC |
使用 G1 垃圾回收器,JDK 9 后为默认,适合大内存应用,可预测停顿时间。 | -XX:+UseG1GC |
-XX:+UseParallelGC |
使用并行回收器(吞吐量优先),适合后台计算等对停顿不敏感的应用。 | -XX:+UseParallelGC |
| G1 GC 特有参数 | ||
-XX:MaxGCPauseMillis |
G1 的目标最大停顿时间(毫秒),这是一个软目标,JVM 会尽力达成。 | -XX:MaxGCPauseMillis=200 |
-XX:ParallelGCThreads |
STW 期间,GC 线程数,通常设置为逻辑处理器数量。 | -XX:ParallelGCThreads=8 |
-XX:ConcGCThreads |
并发标记/清理阶段,GC 线程数,通常设置为 ParallelGCThreads 的 1/4。 |
-XX:ConcGCThreads=2 |
| 元空间 | ||
-XX:MetaspaceSize |
元空间初始大小,达到此值会触发 Full GC。 | -XX:MetaspaceSize=256m |
-XX:MaxMetaspaceSize |
元空间最大大小,防止元空间溢出。 | -XX:MaxMetaspaceSize=512m |
| 其他常用参数 | ||
-Djava.awt.headless=true |
在无图形界面的服务器上运行时设置,避免因缺少图形环境而报错。 | -Djava.awt.headless=true |
-Dfile.encoding=UTF-8 |
设置 JVM 默认文件编码,避免乱码问题。 | -Dfile.encoding=UTF-8 |
-Xlog |
JDK 9+ 的日志输出方式,功能强大,可替代 -Xloggc。 |
-Xlog:gc:file=gc.log |
server.xml 连接器与核心组件配置
server.xml 定义了 Tomcat 如何接收和处理请求。
连接器 (<Connector>) 配置
连接器负责监听特定端口并接收请求,最常见的 HTTP/1.1 连接器配置如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="50"
acceptCount="100"
maxConnections="10000"
URIEncoding="UTF-8"
compression="on"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
| 属性 | 说明 | 示例 |
|---|---|---|
port |
监听的端口号。 | port="8080" |
protocol |
连接器使用的协议。HTTP/1.1 是标准值,对于高性能场景,可使用 org.apache.coyote.http11.Http11NioProtocol (NIO) 或 org.apache.coyote.http11.Http11AprProtocol (APR)。 |
protocol="HTTP/1.1" |
connectionTimeout |
网络连接超时时间(毫秒)。 | connectionTimeout="20000" (20秒) |
redirectPort |
当 SSL/TLS 加密请求被发送到非加密端口时,重定向到的端口。 | redirectPort="8443" |
| 线程池配置 | ||
maxThreads |
处理请求的最大线程数,这是并发处理能力的关键,应根据 CPU 核心数和应用类型调整。 | maxThreads="500" |
minSpareThreads |
最小空闲线程数,Tomcat 启动时就创建这么多线程,随时准备接收请求,减少请求响应延迟。 | minSpareThreads="50" |
acceptCount |
当所有请求处理线程都在使用时,队列中能容纳的请求数,超过这个数的请求将被拒绝。 | acceptCount="100" |
maxConnections |
接收器能处理的最大连接数,超过此限制,新的连接将被阻塞,默认为 maxThreads 的值。 |
maxConnections="10000" |
| 其他优化 | ||
URIEncoding |
URL 编码方式,强烈建议设置为 UTF-8。 |
URIEncoding="UTF-8" |
compression |
是否启用 GZIP 压缩,可显著减少网络传输量。 | compression="on" |
compressableMimeType |
哪些 MIME 类型的响应会被压缩。 | compressableMimeType="..." |
引擎 (<Engine>) 配置
引擎负责处理连接器传递过来的请求,并传递给相应的虚拟主机。
<Engine name="Catalina" defaultHost="localhost">
...
</Engine>
虚拟主机 (<Host>) 配置
虚拟主机允许在同一个 Tomcat 实例上部署多个网站。

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 单个应用的部署路径 -->
<Context path="/myapp" docBase="/opt/myapp" reloadable="false"/>
<!-- 访问日志配置 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
| 属性 | 说明 |
|---|---|
name |
虚拟主机名,应与 DNS 解析的域名对应。 |
appBase |
该虚拟主机下 Web 应用的存放目录,默认是 webapps。 |
unpackWARs |
是否自动解压 WAR 包。 |
autoDeploy |
是否在 appBase 目录下检测到新应用或更新时自动部署。 |
<Context> |
|
path |
访问该应用的 URL 路径。 |
docBase |
应用的实际文件路径,可以是 WAR 文件或解压后的目录。 |
reloadable |
是否在 WEB-INF/classes 或 lib 目录下的文件有变更时,自动重新加载应用。生产环境建议设为 false,因为频繁重载会导致内存溢出和性能下降。 |
部署配置
热部署与自动部署
- 自动部署:在
server.xml的<Host>中设置autoDeploy="true",Tomcat 会定期扫描appBase目录(默认为webapps),当发现新的 WAR 文件或目录时,会自动部署它。 - 热部署:在
<Context>中设置reloadable="true",当 Tomcat 检测到 WEB-INF 目录下的类文件被修改时,会销毁并重建该应用的ServletContext,实现不重启 Tomcat 更新应用。警告:此功能非常消耗性能,且可能导致内存泄漏,仅在开发环境使用。
部署外部应用
最佳实践是将应用部署在 webapps 目录之外,便于管理和升级。
使用 server.xml 中的 <Context>
<Host name="localhost" appBase="webapps">
<Context path="/myapp" docBase="/data/myapp" reloadable="false"/>
</Host>
使用 META-INF/context.xml (推荐)
- 在应用的 WAR 文件根目录下创建
META-INF文件夹。 - 在
META-INF文件夹中创建context.xml文件。 - 在
context.xml中定义 Context:
<!-- /data/myapp/META-INF/context.xml --> <Context path="/myapp" docBase="/data/myapp" reloadable="false" antiResourceLocking="true"/>
这种方法更灵活,且不会污染 server.xml 配置文件。
日志配置
Tomcat 使用多种日志机制。
catalina.out (标准输出/错误日志)
这是 Tomcat 启动脚本 (catalina.sh) 将标准输出和标准错误重定向到的文件,默认情况下,它会不断增长,需要通过 logrotate 等工具进行轮转。
logs 目录下的日志文件
localhost.xxxx-xx-xx.log:由server.xml中<Host>的className="org.apache.catalina.core.StandardEngineValve"默认生成,记录应用日志。manager.xxxx-xx-xx.log:Manager 应用的日志。host-manager.xxxx-xx-xx.log:Host Manager 应用的日志。access_log.xxxx-xx-xx.txt:由AccessLogValve生成,记录所有 HTTP 访问请求。
使用 java.util.logging (JUL) 配置
Tomcat 默认使用 JUL,可以通过修改 $CATALINA_HOME/conf/logging.properties 来自定义日志级别、格式和输出位置。
集成 Log4j2 或 Logback (强烈推荐)
对于生产环境的应用,强烈建议将应用的日志框架(如 Log4j2 或 Logback)与 Tomcat 的日志分离。
- 做法:在应用的
WEB-INF/lib目录中放入日志框架的 jar 包。 - 优势:
- 日志级别和格式由应用自己控制,更灵活。
- 避免应用日志和 Tomcat 日志混在一起,便于排查问题。
- 可以实现日志文件的独立轮转和管理。
安全配置
- 以非 root 用户运行:创建一个专门的
tomcat用户,并赋予其对$CATALINA_HOME目录的读写权限。绝对不要用 root 用户启动 Tomcat。useradd -s /bin/false tomcat chown -R tomcat:tomcat /opt/tomcat su - tomcat -c /opt/tomcat/bin/startup.sh
- 修改默认端口:将
server.xml中的8005(Shutdown)、8080(HTTP)、8009(AJP) 等默认端口修改为非标准端口,减少被扫描攻击的风险。 - 禁用 AJP 连接器:如果不需要 Apache/Nginx 与 Tomcat 的整合,可以直接注释掉
server.xml中的 AJP 连接器 (<Connector port="8009" ... />)。 - 部署
manager应用:manager应用功能强大但也存在风险,不要将其部署在生产环境,或通过严格的 IP 访问控制来保护它。 - 配置安全阀:在
<Host>或<Context>中配置Valve,实现 IP 访问控制。<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*"/>
| 配置项 | 核心文件 | 关键点 |
|---|---|---|
| JVM 参数 | $CATALINA_HOME/bin/setenv.sh |
-Xms, -Xmx, -XX:+UseG1GC, -XX:MaxGCPauseMillis |
| HTTP 连接器 | $CATALINA_HOME/conf/server.xml |
maxThreads, minSpareThreads, URIEncoding, compression |
| 应用部署 | $CATALINA_HOME/conf/server.xml 或 META-INF/context.xml |
docBase 指向外部路径,reloadable="false" |
| 访问日志 | $CATALINA_HOME/conf/server.xml |
<Valve className="org.apache.catalina.valves.AccessLogValve" ... /> |
| 运行用户 | Linux 系统级 | 创建 tomcat 用户,非 root 运行 |
| 日志管理 | 应用内部集成 | 推荐使用 Log4j2 或 Logback,与 Tomcat 日志分离 |
配置 Tomcat 是一个结合了理论知识和实际经验的过程,你需要根据服务器的硬件配置(CPU、内存)、应用的特点(CPU 密集型、IO 密集型)以及预期的并发量来不断调整和优化这些参数。
