Nginx请求限制模块 – ngx_http_limit_req_module
01.nginx的请求限制模块用于限制单个key(关键字)的请求处理速度。
- 请求限制模块的工作原理:
- 通过limit_req_zone配置项,在http配置段中定义一个共享内存区域,用来存储不同key的信息。
- 通过limit_req配置项,在http,server或location配置段中,指定一个对应的共享内存区域。
- 在指定的共享内存区域中,根据当前计算出的key的信息来限制客户端请求的频率。
- 请求限制模块的配置项包括:
- limit_req,指定一个共享内存区域,并且设置请求限制的参数,其格式为:
limit_req zone=name [burst=number] [nodelay | delay=number];
- zone,自定义的内存共享区域的名称,对应limit_req_zone中配置的zone。
- burst,缓冲队列的长度,即保存多少个未处理的请求。
- nodelay,是否延时处理,如设置为nodelay,则超过请求频率限制同时超出缓冲区的请求会直接返回503。
- delay,与nodelay相反,额外等待的请求次数。
- limit_req_dry_run,是否开启干跑模式;如果开启,请求限制不会生效,但共享内存区域的key值会增加。
- limit_req_dry_run的值为on或者off,默认为off。
- limit_req_dry_run可以配置在http,server或location配置段中。
- limit_req_log_level,设置当请求被拒绝时,该日志对应的日志级别;delay的日志级别总是比refuse低一级。
- limit_req_log_level的值为info,notice,warn和error;默认为error。
- limit_req_log_level可以配置在http,server或location配置段中。
- limit_req_status,当请求被拒绝时,返回的状态码。
- limit_req_status的默认值为503。
- limit_req_status可以配置在http,server或location配置段中。
- limit_req_zone,设置共享缓存区域的属性,其格式为:
limit_req_zone key zone=name:size rate=rate [sync];
- key,key的名称,通过变量来获取;例如$binary_remote_addr表示以客户端地址的二进制为key。
- zone,自定义的内存共享区域的名称,对应limit_req中配置的zone。
- size,缓存取的大小,单位通常为k,m或者g。
- rate,请求的频率,单位为r/s,比如10r/s表示限制请求频率为每秒10个请求。
- limit_req,指定一个共享内存区域,并且设置请求限制的参数,其格式为:
02.nginx的请求限制模块的配置示例:
- vim /opt/Apps/nginx/conf/nginx.conf,在主配置文件的http段中添加如下配置:
limit_req_zone $binary_remote_addr zone=remote_addr_req:10m rate=1r/s;
- 添加一个名称为remote_addr_req的共享内存区域,其大小为10m;它以客户端的ip地址的二进制为key,限制请求为1秒1个请求。
vim /opt/Apps/nginx/conf/conf.d/main.conf,修改为如下配置:
server {
listen 80;
server_name nginx.test.com;
error_log logs/nginx_test_error.log error;
access_log logs/nginx_test_access.log main gzip flush=5m;
location / {
root html/main;
index index.html index.htm index.php;
limit_req zone=remote_addr_req burst=5 nodelay;
}
}
- 指定名称为remote_addr_req的共享内存区域,其缓冲队列的长度为5个请求,一旦超过频率和缓冲的限制则立刻返回503
- /opt/Apps/nginx/sbin/nginx -s reload,重新加载配置文件。
- ab -c 10 -n 100 http://nginx.test.com/,使用ab工具对站点进行测试:
- 由于每秒只能处理1个请求,并且缓冲队列为5,并且nodelay,所以一共能处理的请求为6个,即100个请求共失败94个。
- 失败的请求以error的日志级别输出。
文档更新时间: 2020-03-11 19:48 作者:闻骏