Nginx限速模块详解-req&conn

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
2
3
4
5
#设置服务器拒绝请求速率,或者延迟处理的情况下的日志级别。对于延迟的请求来说,日志的级	别比拒绝请求要低。例如,“limit_req_log_level notice” 是通知级别,那么,延迟请求只是信息的日志级别
Syntax: limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error;
Context: http, server, location
This directive appeared in version 0.8.18.
1
2
3
4
5
#设置拒绝请求时候的http返回状态码。
Syntax: limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location
This directive appeared in version 1.3.15.
1
2
3
4
#为各种定义的键配置共享内存大小,包括当前连接数。key可以是文本、变量、也可以是文本与变量结合,对于空的key请求,不会进行计数。
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http

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
2
3
4
#设置zone的共享内存大小,以及连接数的最大允许值。当超过这个限制的时候,服务器将返回503状态值。
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
1
2
3
4
5
6
#设置当前服务器限制连接数下所需的日志记录级别。
Syntax: limit_conn_log_level info | notice | warn | error;
Default:
limit_conn_log_level error;
Context: http, server, location
This directive appeared in version 0.8.18.
1
2
3
4
5
#设置拒绝连接后响应的http状态码,默认是503.
Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
This directive appeared in version 1.3.15.
1
2
3
4
#以下指令发布于版本1.1.8,并且在版本1.7.6中移除。等效limit_conn_zone 语法为:
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http

4、生产实际案例配置示范

4.1、需求:对指定域名的指定localtion做限流限速

如下配置均在NGINX HTTP段中进行全局配置,VHOSTS进行引用生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#针对站点进行限速。设置内存共享区为10m,以及最大请求数为每秒1次,当请求的速率大于配置的速率,那么这些请求将会被延迟处理。如果,有过多的请求被延迟,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0
limit_req_zone $server_name zone=perserver:10m rate=1r/s;

#针对源IP地址进行限速。设置内存共享区为10m,以及最大请求数为每秒1次,当请求的速率大于配置的速率,那么这些请求将会被延迟处理。如果,有过多的请求被延迟,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;

#设置拒绝请求时候的http返回状态码。
limit_req_status 503;

#设置服务器拒绝请求速率,或者延迟处理的情况下的日志级别。对于延迟的请求来说,日志的级别比拒绝请求要低。例如,“limit_req_log_level notice” 是通知级别,那么,延迟请求只是信息的日志级别
limit_req_log_level error;

#针对源IP地址进行连接限制。设置内存共享区为10m,如果,有过多的连接,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0
limit_conn_zone $binary_remote_addr zone=peripconn:10m;

#针对站点进行连接限制。设置内存共享区为10m,如果,有过多的连接,超过了最大的限制,服务器将返回503状态码。默认情况下,最大限制为0
limit_conn_zone $server_name zone=perserverconn:10m;

#设置拒绝请求时候的http返回状态码。
limit_conn_status 503;

#设置服务器拒绝请求连接,或者延迟处理的情况下的日志级别。对于延迟的请求来说,日志的级别比拒绝请求要低。例如,“limit_req_log_level notice” 是通知级别,那么,延迟请求只是信息的日志级别
limit_conn_log_level error;
1
2
3
4
5
6
7
8
9
location ~ /lisirlife/alipayRefundNotify.action{
proxy_pass http://jscs_load_balancing;
include cmsproxy.conf;
error_log logs/lisirlife_error.log error;
#允许1秒钟不超过1个请求,最大延迟请求数量不大于5. 如果请求不需要被延迟,添加nodelay参数,服务器会立刻返回503状态码。
limit_req zone=perip burst=1;
#针对源IP地址进行连接限制,限制同一IP并发连接数为1
limit_conn peripconn 1;
}
-------------本文结束感谢您的阅读-------------
LiGuanCheng wechat
如有问题,请与我微信交流或通过右下角“daovoice”与我联系~。
请我喝一杯咖啡~