Nginx限速模块分为:按连接数限速、按请求速率限速
Nginx主要有两种限速方式:按连接数限速(ngx_http_limit_conn_module)、按请求速率限速(ngx_http_limit_req_module)。超出限制的请求会直接拒绝,可防御简单的cc攻击
按连接数限速是指限制单个IP(或者其他的key)同时发起的连接数,超出这个限制后,Nginx将直接拒绝更多的连接。
limit_conn_zone $binary_remote_addr zone=qps1:10m;
server {
listen 80;
server_name www.abc.com;
location /{
limit_conn qps1 1; ##这将指定一个地址只能同时存在一个连接。
limit_rate 300k;
}
}
limit_zone: 是针对每个IP定义一个存储session状态的容器.这个示例中定义了一个10m的容器,按照32bytes/session, 可以处理320000个session。
limit_conn qps1 1:限制每个IP只能发起一个并发连接。
limit_rate 300k: 对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。
按请求速率限速是指限制单个IP(或者其他的key)发送请求的速率,超出指定速率后,Nginx将直接拒绝更多的请求。采用leaky bucket算法实现。
limit_req_zone $binary_remote_addr zone=qps2:10m rate=1r/s;
server {
location /{
limit_req zone=qps2 burst=10 nodelay;
}
}
上面的配置会让nginx 每个IP一秒钟只处理一个请求,但是仍然会有很多还在队列里面等待处理,这样也会占用很多tcp连接,如果加上nodelay就会立即丢弃limit_req zone=qps2 burst=10 nodelay;
。burst关键字开启对突发请求的缓存处理,而不是直接拒绝
因为Nginx的限流统计是基于毫秒的,如果我们设置的速度是2r/s
,转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第二个请求。
Nginx按请求速率限速模块的用法和原理,其中burst和nodelay参数是容易引起误解的,虽然可通过burst允许缓存处理突发请求,结合nodelay能够降低突发请求的处理时间,但是长期来看他们并不会提高吞吐量的上限,长期吞吐量的上限是由rate决定的。需要特别注意的是,burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的阈值。