通过http动词限制nginx请求

时间:2014-05-20 16:29:35

标签: nginx

有什么方法可以使用nginx(1.6.0)来限制动词请求吗?

例如,对于任何一个IP地址,每秒最多允许15 GET秒,但每秒只允许3 POST秒?

目前尝试使用以下内容会在nginx错误日志中出现错误:

2014/05/20 16:24:39 [emerg] 1914#0: "limit_req" directive is not allowed here in /etc/nginx/sites-enabled/site.conf:13

site.conf包含在http块中。

# Rate limiting
limit_req_zone $binary_remote_addr zone=get_requests:10m rate=15r/s;
limit_req_zone $binary_remote_addr zone=post_requests:10m rate=3r/s;
limit_req_status 429;

server {
  listen 4000;

  # Rate limiting
  limit_req zone=get_requests;
  if ($request_method = 'POST') {
    limit_req zone=post_requests;
  }

  location / {
  }
}

修改1

我也尝试在location /之后插入以下条件中断子句,但这不起作用,因为系统每秒限制为1个请求:

limit_req zone=get_requests;
if ($request_method != 'POST') {
  break;
}
limit_req zone=post_requests;

1 个答案:

答案 0 :(得分:1)

尝试这样的事情。

如果$request_method是POST,请返回一个数字代码(" 588"在此示例中),这将由命名位置@postrequests处理以限制它。

# Rate limiting
limit_req_zone $binary_remote_addr zone=get_requests:10m rate=15r/s;
limit_req_zone $binary_remote_addr zone=post_requests:10m rate=3r/s;
limit_req_status 429;

server {
    listen 4000;

    error_page 588 = @postrequests;


    if ($request_method = 'POST') {
        return 588;
    }

   location / {

       limit_req zone=get_requests burst=0;

       # the usual stuff..
   }
   location @postrequests {

       limit_req zone=post_requests burst=0;

       # the usual stuff..
   }
}