nginx可以通过ngx_http_limit_req_modulengx_http_limit_conn_module这两个模块的配置来限制请求频率。

ngx_http_limit_req_module模块

ngx_http_limit_req_module针对自定义的key来限制请求的处理速度,尤其是来源于同一个IP地址的请求,速度限制通过__漏桶算法(leaky bucket)__实现。
◇主要使用limit_req_zonelimit_req指令。

配置实例:

1
2
3
4
5
6
7
8
9
10
11
http {
limit_req_zone $binary_remote_addr zone=gameend:50m rate=10r/s;
...
server {
...
location /api/ {
limit_req zone=gameend burst=50 nodelay;
limit_req_status 503; #默认503,此行可省略
}
}
}

★“limit_req_zone”那一行定义了名称为“gameend”的区域(区域可定义多个,在之后的引用处生效),使用“$binary_remote_addr”键表示对各个不同的IP起作用,分配50M共享存储空间用来保存键的状态参数,平均处理的请求频率不超过每秒10次(rate=10r/s)。这里使用“$binary_remote_addr”而不是“$remote_addr”是因为使用“$binary_remote_addr”所占用存储空间是固定的(状态参数在32位机和64位机上分别占用64字节和128字节,于是1M空间在32位机和64位机上分别能存储16000个和8000个状态。当域的存储空间耗尽,对于后续所有请求,服务器都会返回 503;

★“limit_req”那一行引用上面定义的区域,对请求路径”/api/“生效,同时通过“burst”允许延时处理一定数量的请求(burst默认值为0),当请求速度超过每秒10次但超过的请求数量又没超过50(burst=50)时,会延迟处理请求,而不是被立即返回503(limit_req_status 503),增加“nodelay”参数则以上情形下的请求立即被处理,不会被延迟;

ngx_http_limit_conn_module模块

ngx_http_limit_conn_module针对自定义的key来限制连接数,尤其是来自于同一个ip地址的连接,此处一个连接的定义是有一个服务器正在处理的请求并且请求头已经被读取。
◇主要使用limit_conn_zonelimit_conn指令。

配置实例:

1
2
3
4
5
6
7
8
9
10
http {
limit_conn_zone $binary_remote_addr zone=gameend:10m;
...
server {
...
location /download/ {
limit_conn gameend 1;
}
}
}

★“limit_conn_zone ”那一行定义了名称为“gameend”的区域(区域可定义多个,在之后的引用处生效),分配10M共享存储空间用来保存键的状态参数,当域的存储空间耗尽,对于后续所有请求,服务器都会返回 503;
★“limit_conn”那一行引用上面定义的区域,对请求路径”/download/“生效,同时将最大允许连接数设置为1,当连接数超过1,服务器返回 503错误;


参考: [官方文档](http://nginx.org/en/docs/)