保护后端集群需分层设防:用mod_qos限制单ip并发连接(如qs_srvmaxconnperip 12)和全局连接数(qs_srvmaxconn 300),通过proxyset设定集群级硬限(如maxconnections=80),按节点性能差异化配置balancermember参数,并匹配mpm与后端承载能力(如mpm_event下threadsperchild×serverlimit需≤php-fpm pm.max_children)。

要保护后端集群不被 Apache 过度连接打垮,关键不是“一刀切”限总数,而是分层设防:前端接入限流 + 代理连接池管控 + 后端节点差异化适配。
用 mod_qos 控制单 IP 并发连接数
这是防恶意长连接耗尽资源的第一道防线。它统计真实 TCP 连接(含 Keep-Alive),对 slowloris 类攻击有效。
- 启用 mod_qos 模块后,在主配置或虚拟主机中添加:
QS_SrvMaxConnPerIP 12 —— 每个客户端 IP 最多维持 12 个并发连接
QS_SrvMaxConn 300 —— 全局总连接上限,防个别 IP 被限但其他 IP 占满全部 worker - 注意:该限制作用于 Apache worker 的 ESTABLISHED/KEEPALIVE socket 数,不是请求数。一个 IP 开 50 个空闲长连接,mod_evasive 完全无效,而 mod_qos 会立即拦截第 13 个。
通过 ProxySet 统一约束整个集群的连接规模
当 Apache 作为反向代理(如 ProxyPass 到多个 Tomcat、Gunicorn 或 PHP-FPM 实例),必须用 ProxySet 设定集群级硬限,避免连接无序堆积。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
<proxy></proxy>块顶部添加:
ProxySet maxconnections=80 —— 整个集群最多建立 80 条到后端的并发连接(优先级高于各节点的 max)
ProxySet ttl=600 timeout=10 —— 空闲连接最长存活 10 分钟,请求超时 10 秒 - maxconnections 是硬性总和限制。即使你给每个 BalancerMember 配了 max=50,只要集群总连接达到 80,新请求就会排队或拒绝。
按节点性能差异化配置 BalancerMember 连接参数
后端服务器硬件不一致时,统一设 max 会导致弱节点过载、强节点闲置。应逐节点精细控制。
- 在同一个 balancer 组内,为不同后端指定独立连接策略:
BalancerMember http://192.168.1.10:8080 max=15 min=2 acquire=1500
BalancerMember http://192.168.1.11:8080 max=40 min=5 acquire=3000 retry=60 - max 表示该节点最多保持的空闲连接数;min 是常驻连接数,用于预热;acquire 是客户端等待连接的最长时间(毫秒);retry 是故障隔离时间。
- 务必避免同时使用 ProxySet max=xx 和成员级 max=yy —— ProxySet 会覆盖成员设置,需二选一。
匹配 MPM 与后端承载能力,防止倒挂
Apache 的并发模型必须和后端处理能力对齐,否则前端连接再多,后端也撑不住,反而引发超时和雪崩。
- 若用 mpm_event(推荐):
ThreadsPerChild 25 × ServerLimit 12 = 最多 300 线程 → 对应的 PHP-FPM pm.max_children 应 ≥ 300,Tomcat maxThreads 也建议 ≥ 300 - 若用 mpm_prefork:
MaxClients 150 表示最多 150 进程 → 后端如 PHP-CGI 或旧版 Tomcat,需确保其最大并发线程数不低于此值 - ProxyPass 中的 max 参数是每进程(prefork)或每线程(event/worker)对单后端的连接上限,不是全局值。例如 event 下 ThreadsPerChild=25,max=6,则单后端理论最大连接为 25×6=150。










