生产环境 Tomcat 优化详解

优化生产环境中的 Tomcat 服务器涉及多个方面,包括性能调优、资源管理、安全性增强和稳定性保障。

性能调优

内存设置

  • 调整 JVM 内存参数

    • 设置合适的初始堆大小(-Xms)和最大堆大小(-Xmx),根据服务器的物理内存配置。典型设置如下:
      1
      2
      -Xms2048m
      -Xmx4096m
  • 调整方法区大小

    • 对于 Java 7 及以前版本,可以设置永久代大小(-XX:PermSize-XX:MaxPermSize)。
    • 对于 Java 8 及以后版本,可以调整元空间大小(-XX:MetaspaceSize-XX:MaxMetaspaceSize)。

垃圾收集器

  • 选择合适的垃圾收集器
    • 根据应用程序的特点选择合适的垃圾收集器,例如:
    • 并行垃圾收集器(-XX:+UseParallelGC
    • CMS(-XX:+UseConcMarkSweepGC
    • G1(-XX:+UseG1GC

线程池优化

  • 调整 I/O 模型

    • 比如,配置 Tomcat 使用 NIO、APR 这种相比于 BIO 更加高效的 I/O 模型。
      • 对于 Tomcat 7 及以前版本,默认使用的是 BIO。
      • 对于 Tomcat 8 及以后版本,默认使用的是 NIO。
  • 配置连接器线程池

    • 调整 maxThreads 参数来设置 Tomcat 处理连接所能创建的最大线程数。
    • 调整 minSpareThreads 参数来设置 Tomcat 在空闲时保持的最小线程数。
    • 调整 maxSpareThreads 参数来设置 Tomcat 在空闲时保持的最大线程数。
      1
      2
      3
      4
      <Connector port="8080" protocol="HTTP/1.1"
      maxThreads="200" minSpareThreads="25" maxSpareThreads="75"
      ...
      />

资源管理

数据库连接池

  • 优化数据库连接池
    • 配置合适的数据库连接池大小(maxActive)、连接超时时间(maxWait)和空闲连接数(minIdlemaxIdle)以确保高效的数据库访问。
      1
      2
      3
      4
      5
      <Resource name="jdbc/myDB" auth="Container"
      type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/mydb"
      username="user" password="password"
      maxActive="100" maxIdle="30" minIdle="10" maxWait="10000"/>

静态资源缓存

  • 启用静态资源缓存
    • 配置 Tomcat 缓存静态资源,如 CSS、JS 和图片,减少对这些资源的重复请求。
      1
      2
      3
      <Context ...>
      <Resources cachingAllowed="true" cacheMaxSize="100000" />
      </Context>

安全性增强

禁用不必要的端口

安全配置

  • 配置安全的连接

    • 使用 SSL/TLS 加密通信,确保数据传输的安全性。
      1
      2
      3
      4
      5
      6
      7
      <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
      maxThreads="150" SSLEnabled="true">
      <SSLHostConfig>
      <Certificate certificateKeystoreFile="conf/keystore.jks"
      type="RSA" />
      </SSLHostConfig>
      </Connector>
  • 关闭不必要的端口和服务

    • 仅启用应用程序实际需要的服务,关闭不必要的端口,如 AJP 端口。
      1
      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="::1" />

稳定性保障

会话管理

  • 会话持久化:配置会话持久化机制(如持久化到文件系统),以确保服务器重启后会话数据不丢失。
    1
    2
    3
    4
    5
    <Manager className="org.apache.catalina.session.PersistentManager" 
    saveOnRestart="true"
    maxIdleBackup="30">
    <Store className="org.apache.catalina.session.FileStore"/>
    </Manager>

日志管理

  • 配置日志记录
    • 确保 Tomcat 的日志记录适当配置,使用日志轮转策略(如 Logrotate)防止日志文件过大。
      1
      2
      3
      <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" />

监控与报警

监控工具

  • 使用监控工具

    • 部署监控工具(如 Prometheus、Grafana 等)监控 Tomcat 的性能和健康状态。
  • 启用 JMX 监控

    • 可以通过 JMX 导出 Tomcat 的性能指标。
      1
      2
      <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="8099" rmiServerPortPlatform="8098" />