限制动态应用最大连接数需分层控制:用mod_qos限制单IP并发连接(如QS_SrvMaxConnPerIP 8),匹配MPM参数(如prefork的MaxClients或event的MaxRequestWorkers),代理场景下通过ProxySet约束后端连接池(如max=20),并同步加固内核参数防SYN Flood。

要限制动态应用(如 PHP、Python 或 Node.js 后端)在 Apache 下的最大连接数,核心不是限制“应用本身”,而是控制 Apache 如何接收、分发和维持与这些应用的连接。Apache 本身不直接管理 PHP-FPM 或 WSGI 进程池的连接,但它决定了前端能同时建立多少连接——这直接影响后端资源的消耗上限。关键在于分层控制:连接接入层限流 + 后端代理/通信层匹配 + 内核级防护。
1. 用 mod_qos 精准限制单 IP 并发连接数
这是防动态应用被慢连接拖垮的最有效手段。mod_qos 工作在请求接入层,统计并拦截处于 ESTABLISHED 或 KEEPALIVE 状态的真实 TCP 连接,对 slowloris 类攻击特别有效。
- 启用模块后,在主配置或虚拟主机中添加:
QS_SrvMaxConnPerIP 8 —— 每个客户端 IP 最多维持 8 个并发连接(含空闲长连接)
QS_SrvMaxConn 200 —— 全局总连接上限,避免个别 IP 被限但其他 IP 占满全部 worker - 注意:它限制的是 Apache worker 中活跃 socket 数,不是 HTTP 请求计数。一个恶意用户开 50 个 Keep-Alive 连接却每分钟只发一次请求,mod_evasive 完全无效,而 mod_qos 会立即拦截第 9 个连接。
2. 匹配 MPM 模块参数与后端承载能力
Apache 的并发模型(prefork / worker / event)必须与后端运行方式对齐。例如 PHP-CGI 通常依赖 prefork,而 PHP-FPM 可配合 worker 或 event。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 若使用 mpm_prefork(常见于传统 PHP 部署):
MaxClients 150
StartServers 5
MinSpareServers 5
MaxSpareServers 10
每个进程处理 1 个连接,所以 MaxClients 直接对应最大并发请求数 - 若使用 mpm_event(推荐搭配 PHP-FPM 或反向代理):
MaxRequestWorkers 300
ThreadsPerChild 25
ServerLimit 12
此时并发能力由线程数决定,需确保 PHP-FPM 的 pm.max_children ≥ MaxRequestWorkers
3. 在代理场景下约束后端连接池
当 Apache 作为反向代理(如 ProxyPass 到 Gunicorn、uWSGI 或本地 PHP-FPM),必须显式限制到后端的连接行为,否则前端连接数再多,后端也可能被瞬间打爆。
- 对 PHP-FPM Unix socket 代理:
ProxySet timeout=5 retry=5 max=20 acquire=3000
其中 max=20 表示最多维持 20 个到 FPM 的复用连接,超出请求排队等待 - 对 HTTP 后端(如 Python 应用):
ProxySet keepalive=on max=15 smax=5
限制连接池大小,防止 Apache 建立过多空闲连接占用后端资源
4. 同步加固内核网络栈防绕过
mod_qos 只管已进入 Apache 的连接,攻击者可能通过大量 SYN 半连接耗尽内核队列,导致 Apache accept() 阻塞。必须配合以下内核参数:
- net.ipv4.tcp_syncookies = 1 —— 开启 SYN Cookie,抵御 SYN Flood
- net.ipv4.tcp_synack_retries = 3 —— 减少半连接重试次数,加速超时释放
- net.core.somaxconn = 1024 —— 增大 listen 队列长度,避免新连接被丢弃
验证是否生效不能只看配置加载,要用 ss -tn src <client-ip> | grep :80 | wc -l 实测 ESTABLISHED 连接数是否卡在 QS_SrvMaxConnPerIP 设定值附近。不复杂但容易忽略。

















