如何限制恶意用户刷站 - Nginx 限速规则

发布时间: 2015-12-12 20:45:34 作者: 大象笔记

真实案例

收到短信报警,调用一些三方 API 接口超时。从 Nginx 看,发现是一个调用三方 API 接口被刷。 短时间内超过了百万次。不可避免的影响了正常业务。

刷站请求特征

解决方法

在 Nginx 上限制单 IP 单位时间的请求数,以及单 IP 的并发连接数。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s;

    server {
        location /search/ {
            limit_req zone=one burst=5;
        }

如何估算 limit_req_zone size

One megabyte zone can keep about 16 thousand 64-byte states.

那么 10M 就可以存储 16 万的 IP 统计信息, 这个对普通应用足够了,16 万每秒的 UV,已经屌爆了。

如果 size 的大小如果设置小了, 例如设置成 1M,那么当一秒内的请求 IP 数超过 16000 的时候,超出的 IP 对应的用户看到的均为 503 Service Temporarily Unavailable 页面了。参考, 漏桶算法 Leaky Bucket。 同时,rate 的单位用 r/s 非常合适,如果换成按天,按小时计数,10M 的内存肯定不够用。

如何估算 limit_req_zone rate

首先需要知道的是,普通浏览器的同时并发数量。按照 Dropbox 技术博客里所谈到的,目前主流浏览器限制 AJAX 对同一个子域名的并发连接数是6个。IE 6,IE 7 是两个。

most browsers have a limit of 6 concurrent connections per host name

参考

假设每个请求都能在 100 毫秒内完成,那么每秒的限制应该是 10 个。

基于统计的方法

统计 nginx access.log 中最近5分钟/10分钟的请求 IP top 榜, 超过一定数值自动添加 iptables.

如何监控到

参考

我是一名山东烟台的开发者,联系作者