Nginx提供了两种限流手段:一是控制速率,二是控制并发连接数。

1.控制速率

使用limit_req_zone来限制单位时间内的请求数,即速率限制,示例配置如下:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit;
    }
}

以上配置表示,限制每个IP访问的速度为2r/s,因为Nginx的限流统计是基于毫秒的,我们设置的速度是2r/s,转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第2个请求。

速率限制允许突发burst:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit burst=4;
    }
}

burst=4表示每个IP最多允许4个突发请求。

2.控制并发连接数

利用limit_conn_zone和limit_conn两个指令即可控制并发数,示例配置如下:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

其中limit_conn perip 10表示限制单个IP同时最多能持有10个连接;limit_conn perserver 100表示server同时能处理并发连接的总数为100个。

PS:只有当request header被后端处理后,这个连接才进行计数。