Nginx限制连接和请求

一.ngx_http_limit_conn_module

对同一个ip/server的连接数做限制.

配置指令:

limit_conn_zone

语法: limit_conn_zone $variable zone=name:size;

默认值: none

配置段: http

$veriable:常见取值

a.$binary_remote_addr 以客户端ip作为key

b.$server_name 以server作为key

示例:

limit_conn_zone $binary_remote_addr zone=addr:10m;

以客户端的ip地址做key,配置了一个名称为addr的共享内存为10m空间的限制域.如果内存空间被耗尽,则返回503错误.

使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录

当多个 limit_conn 指令被配置时,所有的连接数限制都会生效

http, server, location段配置:

limit_conn addr 4; #同一ip,同一时间,只允许有4个连接
limit_rate 200k;#每个连接的下载速度

二.ngx_http_limit_req_module

对同一个ip的请求数做限制

配置指令:

limit_req_zone

语法: limit_req_zone $variable zone=name:size rate=rate;

默认值: none

配置段: http

示例:

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

说明:

以客户端ip为key,建立了一个共享内存为10m的limit限制域.每秒可新增1个请求.

http, server, location段配置:

limit_req zone=limit burst=5; //漏桶原理,使用limit限制域限制的速率,每秒1个来处理请求,在处理未完成时,允许有5个请求放在缓存区,其余的请求都要等待.所以单个ip限制的最高峰值为5.

如果不希望这些请求等待,直接返回拒绝结果,加nodelay;则其余请求直接返回默认的503;

limit_req zone=limit burst=5 nodelay;

如果不加nodelay:

单个ip需要把并发在控制在burst限制内

如果加了nodelay:

单个ip不但需要把并发控制在burst内,而且不超出rate(速率)限制.

三.两者的区别

1.limit_conn是针对连接,即tcp连接,通过三次握手而建立的一个完整状态机制,来建立一个连接。(keep-alive的出现就是为了减少这种握手的次数,是同一连接可以复用.减少开销)

2.limit_req是针对请求,即http请求.

打开一个网页,图文并茂的那种,通常浏览器可能同时建立1-4个连接(依据不同浏览器和传输协议和keep-alive等,实际有所不同),然后由这些连接来发出几十个乃至上百个请求.

浏览器尽管同时能打开多个连接,但limit_conn限制了同时打开的连接个数.如同时只有1个,则其余的都需要等待.

连接打开后,就会尽快处理请求,比如返回文本或图片;limit_req则限制了同一ip在同一时间内请求的速度.比如每秒1个,超过这个速率限制,都会等待或不处理.

如果配置了keep-alive,则一个连接可以处理很多个请求,只要这些请求在limit_req的限制下.

简而言之,如果将web server比作游乐场,limit_conn限制了通道数目,有几条;limit_req限制了每个通道,可以通行速度.

因为limit_conn限制了连接数,同时还可以限制下载速度,一般用作下载方面的限制.

limit_req则一般用作cc攻击防护.