max= 参数控制每个 Apache 进程/线程到同一后端的最大并发连接数,非全局上限;需结合 MPM 模型、Keep-Alive 支持及正确配置位置(VirtualHost 内、模块启用、顺序合规)才生效,否则无效。在 Apache 虚拟主机中用 `ProxyPass` 指令直接设置 `max=` 参数,是控制后端连接池并发能力最常用也最直接的方式。但它不是“万能开关”,必须结合 MPM 模型、后端服务特性与实际负载场景来调优,否则容易出现连接堆积、503 错误或资源浪费。
明确 max 的真实作用范围
这个 max 值不是全局最大连接数,而是:
→ 每个 apache 子进程(prefork)或每个线程(worker/event)所能建立的到同一后端地址的最大并发连接数。
→ 例如:你用的是 prefork mpm,maxrequestworkers 150,且 proxypass / http://backend/ max=20,那理论最大后端连接数 ≈ 150 × 20 = 3000 —— 但前提是后端真能扛住、网络不瓶颈、且请求模式支持复用。
在 VirtualHost 中正确写法与常见组合
必须确保模块已启用(mod_proxy、mod_proxy_http),然后在 <VirtualHost> 块内写:
ProxyPass /app http://192.168.1.10:8080/ max=50 acquire=3000 retry=60ProxyPass /api http://192.168.1.11:3000/ max=10 min=2 smax=8 ttl=60
注意:
→ min=2 表示始终保活 2 个空闲连接(仅对 HTTP/1.1 + keepalive 后端有效);
→ smax=8 是柔性上限,超过它新建的连接会带 ttl 生存期;
→ acquire=3000 控制客户端等待空闲连接的超时(毫秒),避免卡死;
→ retry=60 让故障节点 60 秒内不参与调度,配合健康探测更稳。
避坑:哪些情况 max 完全不生效?
很多配置看似写了,实则被忽略,原因常是:
- 后端服务关闭了 Keep-Alive(如某些 CGI、短连接脚本),此时连接无法复用,
min/max失去意义 - 把
ProxyPass写在<VirtualHost>外,或没加载mod_proxy_http,Apache 直接跳过参数解析 - 用了
ProxyPass / !排除规则,但顺序错位(排除项必须写在普通 ProxyPass 之前) - 后端返回
Connection: close响应头,强制断连,池子形同虚设
验证是否真正起效
别只看配置文件,动手验证才可靠:
- 运行
apachectl -M | grep -E 'proxy|balancer'确认模块已载入 - 用
curl -v http://your-vhost/app/health查响应头是否有Keep-Alive: timeout=5, max=100 - 后端启动后,执行
netstat -anp | grep :8080 | grep ESTABLISHED | wc -l观察连接数是否稳定在预期区间 - 压测时关注 Apache error log 是否出现
proxy: ap_get_scoreboard_lb(0)或can't obtain connection类报错

















