在 CentOS 上,Apache 限流通常有几种常见做法,取决于你想“限什么”和“限到什么程度”。下面按使用频率从高到低给你讲清楚。
限制单个连接的下载速度(不是请求数)。
CentOS 7/8 默认已带该模块:
httpd -M | grep ratelimit
如果没有,安装:
yum install mod_ratelimit
启用模块(通常已启用):
a2enmod ratelimit # CentOS 一般不用这命令
编辑配置文件(如 /etc/httpd/conf.d/ratelimit.conf):
<IfModule mod_ratelimit.c>
<Location />
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100
</Location>
</IfModule>
说明:
rate-limit 100 表示 100 KB/s示例:限制下载目录
<Directory "/var/www/html/download">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 200
</Directory>
重启 Apache:
systemctl restart httpd
RequestReadTimeout header=10-20,MinRate=500
RequestReadTimeout body=30,MinRate=1000
在 httpd.conf 中:
<IfModule mpm_prefork_module>
MaxClients 150
ServerLimit 150
</IfModule>
Apache 本身不擅长按“请求数/秒”限流,通常用:
yum install mod_security
示例规则(每秒超过 10 个请求封 IP):
SecRuleEngine On
SecAction "id:1000,phase:1,pass,nolog,setvar:ip.requests=+1"
(实际规则较复杂,一般配合 OWASP 规则集)
yum install fail2ban
示例过滤 Apache 频繁访问:
[apache-rate-limit]
enabled = true
filter = apache-access
logpath = /var/log/httpd/access_log
maxretry = 100
findtime = 60
bantime = 600
如果你前面有 Nginx:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
或在 iptables / firewalld 层做限制。
| 需求 | 推荐方案 |
|---|---|
| 限制下载速度 | mod_ratelimit |
| 限制并发 | MaxClients |
| 限制请求频率 | fail2ban / Nginx |
| 防刷接口 | mod_security |
如果你能告诉我:
我可以直接给你可复制的配置。