apache keepalive需分前端(浏览器→apache)与后端(apache→tomcat/php-fpm)两层协同调优:前端keepalive on、keepalivetimeout设2–5秒、maxkeepaliverequests设50–150;后端proxypass须显式加keepalive=on及ttl/retry参数;mpm必须用event模式并匹配线程与后端连接池容量。

Apache 的 KeepAlive 不是“开了就快”,而是要在客户端连接复用与后端资源消耗之间找平衡点。关键不是堆参数,而是分清前端(浏览器→Apache)和后端(Apache→Tomcat/PHP-FPM)两层连接行为,各自调优、彼此协同。
前端 KeepAlive:控制浏览器到 Apache 的连接复用
这是最常被配置也最容易误配的部分。它只影响用户访问页面时的资源加载效率(如 HTML + CSS + JS + 图片是否复用同一 TCP 连接),不涉及 Apache 与后端服务的交互。
- KeepAlive On 必须显式启用,不能依赖默认值;设为 Off 会强制每次请求都新建连接
- KeepAliveTimeout 2–5 秒 是核心:移动端建议 2–3 秒(防 NAT 中间设备静默断连),PC 端可放宽至 4–5 秒;超时过长会导致 worker 线程被空闲连接长期占用
- MaxKeepAliveRequests 50–150:设为 0 表示无限,但高并发下极易因异常请求卡死连接;建议按单页平均资源数 × 1.5 设置(例如 30 个资源,设为 50)
- KeepAliveLengthLimit 和 KeepAliveGroups 属于边缘场景,普通网站无需调整
后端 ProxyPass KeepAlive:决定 Apache 到后端的连接效率
虚拟主机或反向代理场景中,ProxyPass 默认不继承主服务器 KeepAlive 行为。必须在代理指令中单独声明,否则前端复用再好,后端仍是短连接。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
keepalive=On 要直接写在
ProxyPass行末,例如:ProxyPass /api http://127.0.0.1:8000/api keepalive=On - 配套必须加 ttl=30–60(空闲连接池保留秒数)和 retry=15–30(故障隔离时间),避免连接堆积或雪崩
- 若统一管理多个后端地址,推荐用
<proxy></proxy>块配合ProxySet:
ProxySet keepalive=On ttl=45 retry=20 max=30 - 注意:
KeepAliveTimeout对此无效,要用ProxySet keepalive_timeout=5替代,且该值 ≤ 后端自身连接超时(如 Tomcat 的connectionTimeout)
MPM 模式与并发承载能力必须匹配
KeepAlive 效果再好,跑在错误的 MPM 上也会失效甚至拖垮服务。prefork 模式下每个连接占一个进程,万级并发直接内存溢出。
- 必须启用 event MPM:
a2dismod mpm_prefork && a2enmod mpm_event,验证命令:httpd -V | grep -i mpm输出含mpm_event - event 模式下需调优线程参数:
ThreadsPerChild 25、MaxRequestWorkers 400(根据内存容量估算) - 后端连接池要能承接复用压力:例如 Apache 维持 200 个长连接,每连接并发发 2–3 请求,Tomcat 的
maxConnections至少设为 600 - PHP-FPM 场景下,
request_terminate_timeout应略大于 Apache 的KeepAliveTimeout(如前者 3s,后者设 5s),避免提前中断
验证与常见误区
配置完不能只看语法是否正确,要观察真实连接行为。
- 用
curl -v http://your-domain.com/test查响应头:应含Connection: keep-alive,且无Connection: close - 连续发起 10 次请求后,执行
netstat -anp | grep :8080 | wc -l:活跃连接数应明显少于请求数(说明复用生效) - 误区提醒:
–KeepAlive On在虚拟主机里只管前端,不影响后端;
–ProxySet keepalive=On单独写不生效,必须绑定具体ProxyPass或<proxy></proxy>块;
– WebSocket 必须用mod_proxy_wstunnel,且keepalive=On是强制要求










