优先限制单ip并发连接数是防资源枯竭最直接有效的防线,使用mod_qos的qs_srvmaxconnperip(如10)和qs_srvmaxconn(如200)精准控制established/keepalive状态连接,而非仅限请求频次。

要防范 Apache 资源枯竭,关键不是单纯压低请求总数,而是分层控制并发连接数与请求频次,让防护落在真实耗资源的环节上——比如 TCP 连接维持、Keep-Alive 占用、后端线程排队。粗放限速(如只设每秒请求数)容易误伤正常用户,也防不住慢速攻击。
优先限制单 IP 并发连接数(防连接耗尽)
这是最直接有效的防线,尤其针对 Slowloris、R-U-Dead-Yet 等耗尽连接池的攻击。
-
使用
mod_qos模块(生产推荐):-
QS_SrvMaxConnPerIP 10:每个客户端 IP 最多维持 10 个 ESTABLISHED/KEEPALIVE 状态连接 -
QS_SrvMaxConn 200:全局限制总连接数,防个别 IP 被限但其他 IP 突增挤占全部资源 - 它统计的是 socket 连接态,不是 HTTP 请求计数,对长连接真实有效
-
-
避免误用
mod_evasive替代:- 它只统计单位时间内的请求数(如每秒 50 次 GET),对空闲 Keep-Alive 连接完全无感知
- 一个恶意客户端开 100 个慢速长连接,
mod_evasive日志可能安静如常,而netstat -an | grep ESTAB | wc -l已远超预期
对高频业务路径做精准请求限频(防后端过载)
不是所有请求都该被限,重点保护登录、搜索、下单等易被枚举或刷爆的接口。
-
使用
mod_security的SecRule+setvar实现轻量计数:- 只在
phase:1(请求头解析后)触发,不解析请求体,降低 CPU 开销 - 排除非业务路径:用
SecRule REQUEST_URI "\.(js|css|png)$" "nolog,allow"跳过静态资源 - 组合计数防误杀:对
/api/login用IP + User-Agent,对/search?q=xxx用IP + @md5(%{ARGS.q}) - 拦截返回
status:429,避免重定向或模板渲染开销
- 只在
-
不建议用
mod_evasive全站限频:
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
DOSPageCount 2这类配置对 CDN 或内网出口 IP 极易误封整批用户 - 它无法区分“用户刷新首页”和“机器人爆破后台”,策略太粗糙
-
配合内核级防护,堵住 TCP 层绕过漏洞
mod_qos 在应用层生效,但攻击者可跳过它,直打 TCP 半连接队列。
-
必须同步调优内核参数:
-
net.ipv4.tcp_synack_retries = 3:减少 SYN-ACK 重试次数,加快半连接释放 -
net.ipv4.tcp_syncookies = 1:开启 SYN Cookie,防止 SYN Flood 耗尽队列 - (可选)配合
iptables -m limit --limit 10/sec限制新建连接速率
-
-
验证是否真生效:
- 不看日志是否报错,而用
ss -tn src <client-ip> | grep :80 | wc -l</client-ip>查实际 ESTABLISHED 数 - 用
ab -n 100 -c 50 http://site/压测后对比设定值是否卡住
- 不看日志是否报错,而用
补充:子域名或目录级差异化控制
Apache 原生不支持按 Host 头独立限流,但可通过模块组合实现近似效果:
-
在
<virtualhost></virtualhost>内启用mod_limitipconn:-
<ifmodule mod_limitipconn.c> MaxConnectionsPerIP 8 </ifmodule> - 适用于
download.example.com这类下载子域,防多线程拉取
-
-
对 API 子域,更推荐用
mod_qos+<if></if>包裹规则:-
QS_SrvMaxConnPerIP 20+QS_SrvMaxReqPerSec 100 - 注意:
QS_SrvMaxReqPerSec是全局值,需配合QS_LocRequestLimit绑定<location></location>才真正隔离
-
不复杂但容易忽略









