Nginx 根据 IP 限流

有的时候站点可能会遭受到 DDOS,之前就遇到过某段时间被 DDOS 了,第二天就有 CDN 供应商打电话询问要不要买他们的服务,呵呵,因此对于 IP 限流是很有必要的。

最基本的配置:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

server {
    location /login/ {
        limit_req zone=mylimit;

        proxy_pass http://my_upstream;
    }
}

这里的 zone 是共享的内存块,可以存储数据,这里以 IP 作为 Key。

burst 参数

location /login/ {
    limit_req zone=mylimit burst=20;

    proxy_pass http://my_upstream;
}

在上面定义了 rate 为:10r/s,burst 相当于一个 queue,当请求超过 10r/s 的时候,前 10 个请求会正常返回,后面的 20 个请求会进入 queue ,,并且会以 10r/s 的出队列,再之后的所有请求都会被拒绝。

完整示例:

limit_req_zone $binary_remote_addr zone=ip:10m rate=5r/s;

server {
    listen 80;
    location / {
        limit_req zone=ip burst=12 delay=8;
        proxy_pass http://website;
    }
}

two-stage-rate-limiting-example

白名单

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;

server {
    location / {
        limit_req zone=req_zone burst=10 nodelay;

        # ...
    }
}