不遵守Nginx auth_request节流阀

时间:2018-07-16 18:37:38

标签: nginx nginx-reverse-proxy throttling

我有一个类似于以下的nginx配置(省略了一些详细信息):

http {

  map $request_uri $guid {
     default "unknown";
     ~^/out/v\d+/(?P<id>.+?)/.+$ $id;
  }

  map $http_x_forwarded_for $last_client_ip {
     default $http_x_forwarded_for;
     ~,\s*(?P<last_ip>[\.\d]+?)\s*$ $last_ip;
  }

  limit_req_zone $guid zone=content:20m rate=500r/s;
  limit_req_zone $guid zone=auth:20m rate=100r/s;

  server {

    location /out/ {
      auth_request       /auth;

      set $request_type  "unknown";

      proxy_pass         $upstream_server;
      proxy_cache        content_cache;
      set $cache_key "${request_path}";
      proxy_cache_key    $cache_key;
      proxy_cache_valid  200 301 302  10s;

      #Throttling
      limit_req zone=content burst=50 nodelay;
      limit_req_status 429;
    }

    location /auth {
      internal;

      set $auth_type 1;
      proxy_pass_request_body off;
      proxy_pass         $upstream_server/auth?id=$guid&requestor=$last_client_ip;

      proxy_cache        auth_cache;
      set $auth_cache_key "${guid}|${last_client_ip}";
      proxy_cache_key    $auth_cache_key;
      proxy_cache_valid  200 301 302  5m;
      proxy_cache_valid  401 403 404  5m;

      #Throttling
      limit_req zone=auth burst=50 nodelay;
      limit_req_status 429;
    }
  }
}

/out/上的请求限制可以正常工作-超过500r / s的请求受到限制。但是,我似乎无法使/auth受到限制。

我猜想这可能是由于auth_requestlimit_req之间的相互作用,或者可能是由于/auth请求是子请求。我将不胜感激!

2 个答案:

答案 0 :(得分:0)

我怀疑这与您用作的变量有关:$ guid。这不是nginx变量,遗憾的是您的代码片段没有显示您如何定义它。但是,将其传递给代理的方式使我怀疑对/ auth的每个请求都具有不同的$ guid。然后,您将永远不会遇到限制,因为nginx会计算每个密钥的请求,请参见:https://www.nginx.com/blog/rate-limiting-nginx/

因此,如果根本没有为/ out /设置$ guid,则所有请求均计入限制。没问题。但是,如果对/ auth的每个请求的确不同,那么它将不起作用。

答案 1 :(得分:0)

我已经从Nginx邮件列表中收到了对此行为的解释:

  

limit_req指令不会尝试限制已经受到限制的请求,   以及这些请求中的子请求。您应该配置所有   限制您要在一个地方应用到请求。

(请参见https://forum.nginx.org/read.php?2,280554,280558#msg-280558