lin 发表于 2025-11-12 17:06:24

如何限制每个 IP 的请求数?

在网站运维过程中,我们常常遇到一些异常请求,例如某个 IP 在短时间内频繁访问网站,导致服务器 CPU 占用过高、带宽被占满、甚至影响正常用户的访问。
为了防止这种情况,我们需要 限制每个 IP 的请求数,即所谓的 请求速率限制(Rate Limiting)。
本文将介绍几种常见的实现方式,包括在 Nginx、Apache、以及 防火墙层 的配置方法。
一、为什么要限制 IP 请求数?
主要有以下几个原因:

[*]防止恶意爬虫或暴力破解
一些爬虫会在极短时间内频繁请求页面,造成网站卡顿甚至宕机。

[*]防止 DDoS 攻击初期的流量冲击
虽然限制 IP 无法抵御大规模攻击,但可以有效抵挡低强度的单源攻击。

[*]保护后端接口性能
对于 API 接口或登录请求,限制速率可以避免用户频繁调用导致数据库压力过大。
二、在 Nginx 中限制请求速率
Nginx 提供了两个重要模块用于限制请求速率:
limit_req_zone:定义限速规则和共享内存区域。
limit_req:应用限速策略到指定的请求路径。
示例配置:
http {
    # 定义共享内存区域:每个IP的限制
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
      listen 80;
      server_name example.com;
      location / {
            # 应用速率限制
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://127.0.0.1:8080;
      }
    }
}参数解释:

[*]zone=one:10m:定义一个10MB大小的共享内存,可存储约16万个IP。
[*]rate=10r/s:每个IP每秒允许10个请求。
[*]burst=20:允许瞬时突发流量(最多20个请求)。
[*]nodelay:超出速率的请求立即返回503,不排队等待。
测试效果:
当同一 IP 请求频率超过设定速率时,Nginx 会返回:
HTTP/1.1 503 Service Temporarily Unavailable三、在 Apache 中限制请求速率
Apache 可通过模块 mod_ratelimit 和 mod_evasive 实现请求控制。
使用 mod_evasive:
安装模块:
apt install libapache2-mod-evasive -y编辑配置 /etc/apache2/mods-enabled/evasive.conf:
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60参数说明:

[*]DOSPageCount:同一页面1秒内超过5次请求即触发限制。
[*]DOSBlockingPeriod:封锁该 IP 60 秒。
[*]DOSSiteCount:整个站点每秒超过50次请求也会触发封锁。
重启服务:
systemctl restart apache2四、使用防火墙 (iptables) 限制请求数
如果不想修改Web服务器配置,可以通过 iptables 直接限制请求频率。
示例:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 1 --hitcount 20 -j DROP含义:

[*]每个 IP 每秒超过 20 次新的 TCP 连接请求将被丢弃。
[*]这种方法适合防御暴力连接型攻击。
五、使用 CDN 或 WAF 实现限速
如果网站前端有使用 CDN(内容分发网络) 或 WAF(Web 应用防火墙),大多数平台(如 Cloudflare、阿里云、腾讯云、百度云加速等)都提供限频功能。
优势:

[*]不占用服务器资源;
[*]可灵活配置不同路径的速率;
[*]对大规模访问更有效。
六、总结

方式层级优点缺点
Nginx limit_req应用层灵活配置、精细控制需要修改配置
Apache mod_evasive应用层简单有效配置项少,较粗糙
iptables网络层不依赖服务端应用管理复杂,易误封
CDN/WAF云防护层可防御大流量攻击需第三方支持
七、最佳实践建议
对静态资源(图片、CSS)不建议限速;
对 API、登录、搜索等接口重点控制;
定期查看日志,调整限速参数;
配合监控报警系统(如 Prometheus + Grafana)实时观察请求量。
结语:
限制每个 IP 的请求数是防御恶意访问的重要手段之一。
合理配置限速策略,不仅能保护服务器资源,还能保障网站的稳定与安全。
页: [1]
查看完整版本: 如何限制每个 IP 的请求数?