1, ngx_http_limit_req_module模块指令


  1. limit_req_zone
  2. 语法: limit_req_zone $variable zone=name:size rate=rate;
  3. 默认值: none
  4. 配置段: http
  5. 设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。
  6. 键的值就是指定的变量(空值不会被计算)
  7. limit_req_zone $binary_remote_addr zone=allip:10m rate=10r/s;
  8. 区域名称为allip,大小为10m,平均处理的请求频率不能超过每秒十次。
  9. 键值是客户端IP
  10. 使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约16千个64字节的记录。
  11. 如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
  12. 速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,1秒处理一个请求,可以使用 30r/m 一分钟处理30个请求。
  1. limit_req
  2. 语法: limit_req zone=name [burst=number] [nodelay|delay=number];
  3. 默认值:
  4. 配置段: http, server, location
  5. 设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。 超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。这个阈值的默认值为0
  6. burst 默认值为0
  7. delay 默认值为0,如果超过burst,还需要延迟发送的话,可以设置delay的值。
  8. http {
  9. limit_req_zone $binary_remote_addr zone=allip:10m rate=10r/s;
  10. server {
  11. location / {
  12. limit_req zone=allip burst=20 delay=10;
  13. }}
  14. }
  15. 限制平均每秒不超过十个请求,同时允许超过频率限制的请求数不多于20个。
  16. 如果不希望超过的请求被延迟,可以用nodelay参数。
  1. limit_req_status
  2. 语法: limit_req_status code;
  3. 默认值: limit_req_status 503;
  4. 配置段: http, server, location
  1. limit_req_log_level
  2. 语法:limit_req_log_level info | notice | warn | error;
  3. 默认值: limit_req_log_level error;
  4. 配置段: http, server, location

ngx_http_limit_req_module + 白名单

  1. geo $limit {
  2. default 0;
  3. 10.0.0.0/8 1;
  4. 192.168.0.0/24 1;
  5. }
  6. map $limit $limit_key {
  7. 0 "";
  8. 1 $binary_remote_addr;
  9. }
  10. limit_req_zone $limit_key zone=all:10m rate=10r/s;
  11. server {
  12. location / {
  13. limit_req zone=all burst=20 nodelay;
  14. # ...
  15. }
  16. }

多limit_req

  1. http {
  2. # ...
  3. limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
  4. limit_req_zone $binary_remote_addr zone=req_zone_wl:10m rate=15r/s;
  5. server {
  6. location / {
  7. limit_req zone=req_zone burst=10 nodelay;
  8. limit_req zone=req_zone_wl burst=20 nodelay;
  9. # ...
  10. }
  11. }
  12. }

参考文档
https://www.nginx.com/blog/rate-limiting-nginx/
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html