Nginx 提供了多种方式来限制 IP 的访问频率,有效地防止 DDoS 攻击、爬虫或滥用。下面介绍几种常见的方法来实现这一目标:
方法一:使用 limit_req 模块
Nginx 的 limit_req 模块允许你根据请求速率限制客户端的请求数量。这是最常用的限制频率手段。
- 配置
limit_req_zone首先,在全局或 server block 级别声明一个速率限制区域:
http { limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; # 每秒限速 1 个请求,使用 10MB 内存存储计数器 } - 应用到 location
在 location 块中应用限制:
location / { limit_req zone=mylimit burst=5 nodelay; # 爆发请求不超过 5,立即拒绝 }这样设置后,每个 IP 每秒最多发送一个请求,超出后会被临时拒绝。
方法二:使用 limit_conn 模块
如果只是简单地限制每个 IP 同时打开的连接数,则可以使用 limit_conn 模块:
http {
limit_conn_zone $remote_addr zone=perip:10m; # 每个 IP 用 10MB 内存
}
server {
...
limit_conn perip 10; # 每个 IP 同时允许 10 个连接
}
方法三:使用第三方模块 ngx_http_geoip_module
如果你希望基于地理位置或其他条件限制访问,可以使用 ngx_http_geoip_module 模块,但这需要安装 GeoIP 数据库。
- 下载并编译 Nginx 包含该模块
- 下载 GeoIP 数据库
- 配置限制
geo $mycountry { default 0; country US jp 1; # 允许美国和日本的 IP } server { if ($mycountry != 1) { return 444; # 如果不在白名单国家,则返回 444 } }
方法四:使用 ngx_http_access_module
如果你想创建黑名单或白名单,可以直接使用 allow 和 deny 命令:
location / {
deny 192.168.1.1; # 黑名单
allow 192.168.1.2; # 白名单
deny all; # 默认拒绝所有其他 IP
}
小贴士
- 监控日志:经常检查访问日志,寻找异常模式,更新黑名单或调整限速阈值。
- 测试设置:在上线前,使用工具如 ab 或 wrk 对新配置进行压力测试,确保设置不影响正常服务。
- 合法性检查:确保你的限制措施符合法律要求,尤其是涉及数据保护和隐私法。
通过以上方法,你可以有效地防止恶意攻击和滥用,保护 Nginx 服务器免受大量无效请求的影响。