Nginx如何限制请求速率?

Nginx可以通过limit_req模块限制客户端的请求速率。该模块允许设置限制请求的数量和时间周期,可以有效防止恶意请求过载服务器。

limit_req_zone指令用于定义限速区域:
limit_req_zone $binary_remote_addr zone=name:size rate=rate;

  • $binary_remote_addr:限制键,一般为客户端IP
  • zone:区域名和内存大小
  • rate:速率,格式为rate=req/time 例如rate=10r/m 表示每分钟10个请求

limit_req指令用于在location中开启限速:
limit_req zone=name [burst=burst] [nodelay];

  • zone:引用的限速区域名
  • burst:超出速率许可的短时间内最大请求数,默认值为zone定义的rate值
  • nodelay:不延迟,超过速率直接返回503错误

配置示例:

# 限速区域,10秒内最多60个请求
limit_req_zone $binary_remote_addr zone=limit_req:10m  rate=60r/s;  

server {
    ... 
   # 开启限速,引用limit_req区域,只能在1秒内超过6个请求
   location /search/ {    
       limit_req zone=limit_req burst=6 nodelay;   
   }
}

上例定义了limit_req限速区域,允许每10秒60个请求;location块开启了该区域的限速,burst超出为6,超过则直接返回503错误。
所以该location在1秒内只允许6个请求,超过返回错误,有效限制了请求速率。