Apache通过Worker MPM(线程模型)配合mod_proxy_http连接复用及Tomcat NIO调优,协同提升长连接处理能力;需配置StartServers、MaxRequestWorkers、ThreadsPerChild等参数,并验证Connection: keep-alive生效。
apache本身不直接使用“worker模式”处理java应用请求,它通过反向代理将请求转发给后端java容器(如tomcat、jetty)。所谓“提升长连接请求处理能力”,关键在于apache的mpm(multi-processing module)配置与后端java服务协同优化。worker mpm(基于线程)比默认的prefork mpm(基于进程)更适合高并发、长连接场景,但需配合正确的模块启用、连接复用和超时设置。
启用Worker MPM并调优线程/进程参数
Worker MPM混合使用进程和线程:每个子进程包含多个工作线程,线程共享进程内存,资源开销更低,适合大量并发连接(尤其是Keep-Alive长连接)。
- 确认Apache编译时启用了Worker MPM:
httpd -V | grep MPM应显示worker - 在
httpd.conf或mpm_worker.conf中配置核心参数:- StartServers:启动时创建的子进程数(建议2–4)
-
MaxRequestWorkers:最大并发线程总数(原
MaxClients),决定吞吐上限;设为ThreadsPerChild × MaxSpareThreads的合理值(例如1024) - ThreadsPerChild:每个子进程的线程数(建议64–256,过高易触发系统线程限制)
- MaxConnectionsPerChild:子进程最大处理请求数(设为0表示不限,避免频繁重启影响长连接稳定性)
启用mod_proxy_http并开启连接复用
Apache作为反向代理时,默认对后端Java服务建立短连接。开启HTTP/1.1 Keep-Alive复用可显著减少TCP握手和TLS协商开销,尤其利于长轮询、SSE或WebSocket升级前的HTTP阶段。
- 确保加载
mod_proxy、mod_proxy_http、mod_proxy_balancer(如需负载均衡) - 在Proxy配置中显式启用连接复用:
ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy><h1>启用后端连接池与Keep-Alive</h1><p>ProxySet keepalive=On ProxySet timeout=5 ProxySet retry=60</p><p>ProxyPass / <a href="https://www.php.cn/link/d6686469a29701048799005b5ebb1529">https://www.php.cn/link/d6686469a29701048799005b5ebb1529</a> ProxyPassReverse / <a href="https://www.php.cn/link/d6686469a29701048799005b5ebb1529">https://www.php.cn/link/d6686469a29701048799005b5ebb1529</a> -
keepalive=On让Apache复用到后端的TCP连接;timeout控制空闲连接保持时间;retry定义后端不可用时临时移出连接池的时间(单位秒)
同步调优后端Java容器(以Tomcat为例)
Apache的Worker模式效果受限于后端连接处理能力。Tomcat需匹配Apache的连接模型,避免成为瓶颈:
- 在
server.xml的Connector中启用NIO/NIO2(非BIO):<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="500" minSpareThreads="25" keepAliveTimeout="30000" maxKeepAliveRequests="1000" connectionTimeout="20000" ... /> -
maxThreads应 ≥ Apache的MaxRequestWorkers× 0.8(留余量),避免请求排队 -
keepAliveTimeout建议设为30秒左右,与Apache的timeout协调;maxKeepAliveRequests设为较大值(如1000)或-1(不限) - 关闭Tomcat的
useSendfile(若Apache启用了EnableSendfile),防止文件传输冲突
补充:监控与验证长连接有效性
仅配置不验证等于未优化。可通过以下方式确认长连接真正生效:
立即学习“Java免费学习笔记(深入)”;
- 用
curl -v http://your-domain/查看响应头是否含Connection: keep-alive,且无Connection: close - 抓包(Wireshark/tcpdump)观察客户端→Apache→Tomcat间是否存在TCP连接复用(相同端口多次HTTP请求)
- Apache日志中启用
%{pid}P %{tid}P记录进程/线程ID,结合mod_status(ExtendedStatus On)实时观察线程占用与空闲状态 - 压测时关注
ss -s输出的established连接数变化趋势,稳定增长后趋平说明连接池起效










