Nginx限速模块详解-req&conn
1、req&conn模块介绍
ngx_http_limit_req_module
模块用于限制对每个定义键的请求处理速率,例如,单客户端IP的每秒请求数。实现的原理是使用“漏桶”原理。ngx_http_limit_conn_module
模块用于限制每个定义的键的连接数,特别是每个IP的连接数。
2、req模块指令解析
提示:速率是指每秒的请求指定速率,如果要设置每秒请求低于一个请求的速率,可以设置为r/每分钟,例如30r/m
1
2
3
4 #设置共享内存区,以及请求最大数。当请求的速率大于配置的速率,那么这些请求将会被延迟处理。如果,有过多的请求被延迟,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0。
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: -
Context: http, server, location
1 | #设置服务器拒绝请求速率,或者延迟处理的情况下的日志级别。对于延迟的请求来说,日志的级 别比拒绝请求要低。例如,“limit_req_log_level notice” 是通知级别,那么,延迟请求只是信息的日志级别 |
1 | #设置拒绝请求时候的http返回状态码。 |
1 | #为各种定义的键配置共享内存大小,包括当前连接数。key可以是文本、变量、也可以是文本与变量结合,对于空的key请求,不会进行计数。 |
2.1、req指令example
示例一、此配置会对当前所有站点进行单个IP的访问速率进行限制
1
2
3
4
5
6
7 limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
示例二、此配置仅针对引用此
zone=one
的vhosts生效。
1
2
3
4
5
6
7
8 #允许1秒钟不超过1个请求,最大延迟请求数量不大于5.
#如果请求不需要被延迟,添加nodelay参数,服务器会立刻返回503状态码
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5 nodelay;
server {
location /search/ {
limit_req zone=one burst=5;
}
- 列子解析:
以上的例子,客户端IP作为了一个键值。注意到这里使用了
$binary_remote_addr
,而不是$remote_addr
。$remote_addr
变量的大小在7到15个字节之间,存储占用32位平台上的32或64字节的内存,并且在64位平台上总是有64个字节内存。$binary_remote_addr
变量总是占用4个字节内存,存储占用32位平台上的32字节的内存,并且在64位平台上总是有64个字节内存。一个存储区可以保存3200个32字节或1600个64字节。如果存储区满,服务器将对其他请求相应503状态码。
3、conn模块指令解析
提示:对于每个http请求,只有当请求的header被完全读取的时候,才被计算作1个链接数。
1 | #设置zone的共享内存大小,以及连接数的最大允许值。当超过这个限制的时候,服务器将返回503状态值。 |
1 | #设置当前服务器限制连接数下所需的日志记录级别。 |
1 | #设置拒绝连接后响应的http状态码,默认是503. |
1 | #以下指令发布于版本1.1.8,并且在版本1.7.6中移除。等效limit_conn_zone 语法为: |
4、生产实际案例配置示范
4.1、需求:对指定域名的指定localtion
做限流限速
如下配置均在NGINX HTTP段中进行全局配置,VHOSTS进行引用生效
1 | #针对站点进行限速。设置内存共享区为10m,以及最大请求数为每秒1次,当请求的速率大于配置的速率,那么这些请求将会被延迟处理。如果,有过多的请求被延迟,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0 |
1 | location ~ /lisirlife/alipayRefundNotify.action{ |