Linux Tomcat参数配置如何优化?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 参数 正文

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

linux tomcat 参数配置
(图片来源网络,侵删)

核心配置文件

Tomcat 的行为主要由以下几个核心文件控制:

  1. $CATALINA_HOME/bin/catalina.sh:Tomcat 的启动、停止和重启脚本,这是最重要的脚本,用于设置环境变量和启动参数。
  2. $CATALINA_HOME/conf/server.xml:Tomcat 的主配置文件,定义了服务器的核心组件,如端口、连接器、引擎、主机等。
  3. $CATALINA_HOME/conf/web.xml:Web 应用的部署描述符默认模板,所有部署到 Tomcat 的应用都会继承这些默认配置。
  4. $CATALINA_HOME/bin/setenv.sh强烈推荐使用,这是一个自定义环境变量的脚本,catalina.sh 在启动时会自动加载它,用于存放你自己的环境变量,避免直接修改 catalina.sh

JVM 内存与性能调优 (catalina.shsetenv.sh)

JVM 参数是 Tomcat 性能优化的关键,这些参数通常在 catalina.shJAVA_OPTS 环境变量中设置。

最佳实践:使用 setenv.sh

为了避免升级 Tomcat 时覆盖你的修改,建议创建 setenv.sh 文件:

# 在 $CATALINA_HOME/bin/ 目录下创建 setenv.sh 文件
touch $CATALINA_HOME/bin/setenv.sh

然后在 setenv.sh 中添加你的 JVM 参数:

linux tomcat 参数配置
(图片来源网络,侵删)
#!/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 实例上部署多个网站。

linux 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 &quot;%r&quot; %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 (推荐)

  1. 在应用的 WAR 文件根目录下创建 META-INF 文件夹。
  2. META-INF 文件夹中创建 context.xml 文件。
  3. 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 日志混在一起,便于排查问题。
    • 可以实现日志文件的独立轮转和管理。

安全配置

  1. 以非 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
  2. 修改默认端口:将 server.xml 中的 8005 (Shutdown)、8080 (HTTP)、8009 (AJP) 等默认端口修改为非标准端口,减少被扫描攻击的风险。
  3. 禁用 AJP 连接器:如果不需要 Apache/Nginx 与 Tomcat 的整合,可以直接注释掉 server.xml 中的 AJP 连接器 (<Connector port="8009" ... />)。
  4. 部署 manager 应用manager 应用功能强大但也存在风险,不要将其部署在生产环境,或通过严格的 IP 访问控制来保护它。
  5. 配置安全阀:在 <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.xmlMETA-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 密集型)以及预期的并发量来不断调整和优化这些参数。

-- 展开阅读全文 --
头像
2025款MacBook Pro参数有哪些升级?
« 上一篇 今天
Yoga Tab 3 Plus拆机有何发现?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]