mod_qos是最直接有效的单IP并发连接限制方案,它在请求接入层实时统计并拦截超限TCP连接,通过QS_SrvMaxConnPerIP和QS_SrvMaxConn指令精准控制并发数,且对Keep-Alive长连接真实有效。

mod_qos 是最直接有效的方案
Apache 自身不提供原生的单 IP 并发连接数限制能力,mod_qos 是经过生产验证、轻量且精准的第三方模块,专为这类资源治理设计。它工作在请求接入层,能实时统计并拦截超限的 TCP 连接(非仅请求数),避免后端被耗尽。
安装后需启用并配置两个关键指令:
-
QS_SrvMaxConnPerIP 10:全局限制每个客户端 IP 最多维持 10 个并发连接(含 Keep-Alive 状态) -
QS_SrvMaxConn 200:同时设置总连接上限,防止个别 IP 被限但其他 IP 暴涨挤占全部资源
注意:QS_SrvMaxConnPerIP 统计的是 Apache worker 进程中处于 ESTABLISHED 或 KEEPALIVE 状态的 socket 数,不是 HTTP 请求计数,因此对长连接场景更真实有效。
mod_evasive 只能做请求频次控制,不能限并发连接
常见误区是用 mod_evasive 的 DOSSiteLockDelay 或 DOSPageInterval 来“模拟”并发限制——它实际只统计单位时间内的请求次数(如每秒 50 个 GET /),对已建立但空闲的长连接完全无感知。一个恶意客户端开 100 个慢速 Keep-Alive 连接,mod_evasive 会认为它“没发请求”,从而放行。
典型错误现象:[notice] mod_evasive: Blacklisting address xxx.xxx.xxx.xxx 日志频繁出现,但服务器负载仍持续飙升,netstat -an | grep :80 | grep ESTAB | wc -l 显示单 IP 连接数远超预期。
所以,若目标是防连接耗尽(如 CC 攻击中的 slowloris 变种),mod_evasive 不可替代 mod_qos。
配合内核参数防止 SYN 队列溢出
mod_qos 在应用层生效,但攻击者可能绕过它直接打满 TCP 半连接队列。必须同步加固内核网络栈:
- 降低半连接重试次数:
net.ipv4.tcp_synack_retries = 3 - 缩短超时时间:
net.ipv4.tcp_syncookies = 1(开启 SYN Cookie) - 限制单 IP 的新建连接速率(可选):
net.ipv4.netfilter.ip_conntrack_tcp_be_liberal = 1配合 iptables 的limit模块
否则会出现:mod_qos 显示某 IP 已被限流,但 ss -s 中 SYN-RECV 数持续增长,Apache 进程因等待 accept() 而阻塞。
验证是否真正生效的关键检查点
不要只看日志或配置是否加载,必须实测连接态:
- 用
ab -n 100 -c 50 http://your-site/模拟并发,再用ss -tn src查看该 IP 实际 ESTABLISHED 连接数是否卡在| grep :80 | wc -l QS_SrvMaxConnPerIP设定值附近 - 检查
mod_qos状态页:QS_SrvMaxConnPerIP对应的qos_ip_limit计数器是否递增(需开启QS_SrvMaxConnPerIPStatus) - 留意日志中是否有
qos: connection limit per ip exceeded—— 这才是真正触发拦截的标志
最容易被忽略的是:Apache 使用 event MPM 时,一个连接可能复用多个请求,但 mod_qos 仍按 socket 统计;而用 prefork 时,每个连接对应一个进程,统计逻辑一致。别因为 MPM 切换就误判限流失效。









