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个请求,超过返回错误,有效限制了请求速率。