Tomcat的server.xml文件中的<Connector>标签是连接超时的核心配置项,需调整以下参数:
connectionTimeout:设置连接超时时间(单位:毫秒),默认20秒(20000毫秒),可根据业务需求调整为30秒(30000毫秒)或更长,避免因网络延迟导致误判。maxThreads:指定处理请求的最大线程数,默认200。若服务器CPU核心数较多(如4核以上),可适当增加至300-400,提升并发处理能力。acceptCount:当所有线程繁忙时,等待队列的最大长度。默认10,建议设置为maxThreads的1.5-2倍(如300-400),避免请求被直接拒绝。disableUploadTimeout:设为true,禁用上传超时,确保大文件上传时不会因超时中断。示例配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="30000"
maxThreads="300"
minSpareThreads="50"
acceptCount="400"
disableUploadTimeout="true"
redirectPort="8443" />
修改后需重启Tomcat生效:sudo systemctl restart tomcat。
内存不足会导致Tomcat无法处理更多请求,进而引发连接超时。需编辑catalina.sh(位于$CATALINA_HOME/bin目录)文件,调整堆内存和元空间大小:
-Xms:初始堆内存,建议设置为物理内存的1/4(如服务器有4GB内存,设为1024m)。-Xmx:最大堆内存,建议设置为物理内存的1/2(如4GB内存设为2048m),避免内存溢出。-XX:MaxMetaspaceSize:元空间大小,避免元空间溢出,默认无限制可能导致性能下降,建议设置为512m。-XX:+UseG1GC:使用G1垃圾收集器,优化内存回收效率,减少Full GC停顿时间。示例配置:
export CATALINA_OPTS="$CATALINA_OPTS -Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
修改后重启Tomcat使配置生效。
应用程序的性能瓶颈(如同步阻塞、低效SQL)会导致请求堆积,引发连接超时。需采取以下优化措施:
Executors.newFixedThreadPool()创建固定大小的线程池,处理并发任务,避免为每个请求创建新线程消耗资源。ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// 处理请求的业务逻辑
});
@WebServlet(asyncSupported = true, urlPatterns = "/async")
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
try {
// 长时间运行的任务
response.getWriter().write("Task completed");
asyncContext.complete();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
maxPoolSize(如10-20)和connectionTimeout(如30秒);优化SQL语句(如添加索引、避免全表扫描),减少数据库响应时间。若Tomcat前端部署了Nginx或Apache等反向代理,需调整代理的超时配置,确保代理与Tomcat之间的通信不会因超时中断:
http块中添加upstream定义Tomcat集群,设置proxy_connect_timeout(连接超时)、proxy_send_timeout(发送超时)、proxy_read_timeout(读取超时)均为60秒。http {
upstream tomcat_servers {
server 127.0.0.1:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcat_servers;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
ProxyPass指令设置timeout和connectiontimeout为60秒。<Proxy balancer://tomcatcluster>
BalancerMember http://127.0.0.1:8080
</Proxy>
<VirtualHost *:80>
ProxyPass / balancer://tomcatcluster/ timeout=60
ProxyPassReverse / balancer://tomcatcluster/
</VirtualHost>
修改后重启Nginx(sudo systemctl restart nginx)或Apache(sudo systemctl restart apache2)使配置生效。
通过监控工具和日志定位连接超时的根本原因:
tail -f $CATALINA_HOME/logs/catalina.out实时查看日志,搜索“Connection timed out”“SocketTimeoutException”等关键词,定位超时发生的请求和时间点。top(查看CPU、内存使用率)、netstat -tulnp(查看网络连接状态)、ss -s(查看socket统计信息)等命令,判断是否存在CPU过载、内存不足或端口耗尽等问题。若服务器频繁出现连接超时,可能是操作系统TCP参数配置不合理,需调整/etc/sysctl.conf文件:
net.ipv4.tcp_fin_timeout:设置TCP连接关闭后的FIN_WAIT_2状态超时时间,默认60秒,可缩短至30秒,加快连接回收。net.ipv4.tcp_keepalive_time:设置TCP keepalive探测的时间间隔,默认7200秒(2小时),可缩短至1800秒(30分钟),及时检测死连接。net.ipv4.tcp_keepalive_probes:设置keepalive探测次数,默认9次,可减少至2次,降低系统负载。net.ipv4.tcp_keepalive_intvl:设置两次keepalive探测的时间间隔,默认75秒,可缩短至2秒,加快探测速度。修改后执行sudo sysctl -p使配置生效。