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;
}
posted @ 2025-03-25 17:34  Linux小飞象  阅读(182)  评论(0)    收藏  举报