Nginx 限流三剑客之 limit_req
limit_req 介绍
limite_req 是根据给定Key实现限制客户端请求速率的工具,如:客户端IP地址,该限制基于“漏桶”算法实现;
漏桶算法:即给定桶(队列)和漏洞大小(限制速率),当流入桶的速度(请求速率)大于流出桶(限制速率)的速度,则溢出(拒绝),实现请求削峰,借个网图(侵删)

配置方法
limit_req 可在http,server及location中进行配置。
安装方法
limit_req 是ngx_http_limit_req_module模块提供的功能,该模块为默认安装。
[root@db nginx-1.26.3]# ./configure --help |grep limit_req
--without-http_limit_req_module disable ngx_http_limit_req_module
使用方法
# 定义zone:zone的key定义为二进制的remote_addr(即客户端地址),zone名称为one,申请的内存大小为10兆(存放key用),每秒可接收1个(1r/s)来自相同客户端地址(key)的请求。
# limit_req_zone 必须在http进行定义
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
# 使用zone
limit_req zone=one burst=5 nodelay;
limit_req_status 503;
}
burst: 突发请求
当客户端请求速率超过zone的限制,未配置 burst(默认为0) 后续请求将会被直接拒绝,默认拒绝 http 状态码为503.
配置 burst 允许超过zone配置的请求被延迟处理(桶的大小),也可以被理解为队列.
nodelay/delay=2000ms: 队列被延迟处理时间
nodelay:如上文配置,请求速率被限制为1时,如配置为nodelay时,则上一请求处理完后,立即处理下一请求(延迟队列)。
delay=2000ms: 上一请求处理完成后,延迟2秒后继续处理下一请求
不配置:1000ms/限制速率,此处为1,则延迟一秒后处理下一请求;如果限制速率为2,则延迟500ms后处理下一请求。
说明:配置了nodelay会在短时间内增加请求的处理速率,但事件段内的请求速率仍受zone所控制。即zone中rate配置了1r/s的情况下,在1s内可能处理了2个请求,但在连续的1分钟时间段内,总请求数量不会超过60个。
limit_req_status: 超过限制的请求,返回状态码配置(默认为503,但一般自定义配置为509,509非官方http状态码,但常用来表示限流错误返回)
延伸
除针对单个客户端IP地址做请求速率的限制外,还可以限制如虚拟服务器(server)接收请求总数:
limit_req_zone $binary_remote_addr zone=perip:10m rate=3r/s;
# 服务端在1s内只能同时处理10个请求(不针对客户端地址)
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;
}
本文来自博客园,作者:Linux小飞象,转载请注明原文链接:https://www.cnblogs.com/linux-xiaofeixiang/p/18791947

浙公网安备 33010602011771号