CentOS上Tomcat配置最佳实践
调整内核参数以提升网络并发处理能力和系统稳定性。编辑/etc/sysctl.conf文件,添加以下关键参数:
net.core.somaxconn 65535:增加TCP监听队列的最大长度,避免高并发时连接被拒绝;net.ipv4.tcp_tw_reuse 1:允许复用处于TIME_WAIT状态的连接,减少连接建立开销;net.ipv4.tcp_tw_recycle 1:快速回收TIME_WAIT连接(注意:在NAT环境下可能引发问题,需根据实际情况调整)。sysctl -p使配置生效。Tomcat处理高并发时需要大量文件描述符,需提高用户级限制。编辑/etc/security/limits.conf文件,添加:
* soft nofile 65536(软限制,临时生效)
* hard nofile 65536(硬限制,永久生效)
同时修改/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive,添加session required pam_limits.so,确保限制生效。
透明大页会导致内存碎片和性能下降,需在系统启动时禁用。编辑/etc/rc.local文件,添加:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
赋予执行权限chmod +x /etc/rc.local。
通过server.xml中的Executor定义全局线程池,再关联到Connector,避免每个Connector单独创建线程池。示例配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大线程数(根据CPU核心数调整,如8核建议200-500) -->
minSpareThreads="50" <!-- 最小空闲线程数(保持活跃线程,减少创建开销) -->
maxQueueSize="100" <!-- 请求队列长度(队列满则拒绝请求)" />
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
keepAliveTimeout="15000"
maxKeepAliveRequests="100" <!-- 限制长连接请求数,避免闲置连接占用资源 -->
redirectPort="8443" />
说明:maxThreads需结合服务器硬件(CPU、内存)和应用特性调整,建议通过压力测试确定最优值。
Http11NioProtocol(非阻塞I/O),替代传统的BIO(阻塞I/O),提升高并发下的吞吐量;compression="on"、compressionMinSize="8192"(8KB以上才压缩)、compressableMimeType="text/html,text/xml,text/plain,application/json"(指定压缩的MIME类型);keepAliveTimeout(如15秒)和maxKeepAliveRequests(如100),平衡连接复用和资源占用。通过catalina.sh(Linux)或catalina.bat(Windows)设置JVM内存,避免内存溢出(OutOfMemoryError)。关键参数:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
说明:
-Xms和-Xmx设置为相同值,避免堆内存频繁扩容;-Xmn设置年轻代大小(建议为堆的1/2-1/3),提升Minor GC效率;-XX:+UseG1GC使用G1垃圾回收器(适用于大内存、低延迟场景),-XX:MaxGCPauseMillis设置最大GC停顿时间目标。避免中文乱码,在Connector中添加URIEncoding="UTF-8",确保URL中的中文参数正确解析。
server.xml中Connector的port属性(如改为8081);Host标签,设置name为域名(如<Host name="www.example.com" appBase="webapps" unpackWARs="true" autoDeploy="false">),并更新本地hosts文件(127.0.0.1 www.example.com)。修改server.xml中的Server标签,添加server="Apache"(或其他虚假信息),避免暴露Tomcat版本,减少针对性攻击:
<Server port="8005" shutdown="SHUTDOWN" server="Apache">
server.xml中的AJP Connector(<Connector protocol="AJP/1.3" .../>);autoDeploy="false"(Host标签中),避免未经授权的WAR包自动部署。tomcat用户(useradd -r -m -d /opt/tomcat -s /sbin/nologin tomcat),并将Tomcat安装目录的所有权赋予该用户(chown -R tomcat:tomcat /opt/tomcat);tomcat用户仅具备运行Tomcat所需的权限,避免使用root运行。推荐使用HikariCP(轻量、高性能),替代Tomcat自带的DBCP。在context.xml中配置示例:
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
jdbcUrl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"
username="user" password="password"
maximumPoolSize="20" <!-- 最大活跃连接数 -->
minimumIdle="5" <!-- 最小空闲连接数 -->
connectionTimeout="30000" <!-- 连接超时时间(毫秒) -->
idleTimeout="600000" <!-- 空闲连接超时时间(毫秒) -->
maxLifetime="1800000" <!-- 连接最大生命周期(毫秒) -->
validationQuery="SELECT 1" <!-- 连接有效性验证SQL -->
testWhileIdle="true" <!-- 空闲时检查连接有效性 -->
testOnBorrow="false" <!-- 借用时不检查(减少开销) -->
testOnReturn="false" <!-- 归还时不检查 -->
poolPreparedStatements="true" <!-- 预编译语句池化 -->
maxPoolPreparedStatementPerConnectionSize="20" />
通过Tomcat Manager应用或JMX接口监控连接池状态(如活跃连接数、等待连接数),及时发现连接泄漏或配置不合理问题。
删除webapps目录下的默认应用(如ROOT、docs、examples、manager),避免不必要的资源占用和安全风险。
定期检查logs目录下的日志文件(catalina.out、localhost_access_log.*.txt),分析错误日志(如SEVERE级别)和访问日志,定位性能瓶颈或安全问题。可通过logrotate工具实现日志轮转,避免日志文件过大。
及时更新Tomcat至最新稳定版本(修复已知漏洞),并同步更新Java环境和依赖库(如数据库驱动),提升系统安全性和稳定性。