配置NGINX以响应一定百分比的传入请求

时间:2015-11-17 19:10:40

标签: nginx

我想将传入的请求限制为nginx路由。

当前配置与此类似:

upstream up0 {
        server x.x.x.x:1111;
        keepalive 1024;
}

server {
        location /auc {
            limit_req   zone=one    burst=2100;
            proxy_pass http://up0/auc;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
}

我想控制我在上游服务器上看到的请求数量。对于所有其他请求,我希望nginx使用204响应进行响应。

按传入请求的百分比控制也可以。

感谢。

1 个答案:

答案 0 :(得分:5)

Nginx在使用limit_req_zone和limit_req限制请求方面非常有效。

首先创建一个已定义限制的区域。对于全局限制,区域的密钥可以是静态的,也可以使用诸如源IP地址之类的变量作为区域的密钥,这对于限制特定IP或网站上较慢的页面非常有用。费率可以在每秒或每分钟的请求中定义。

  limit_req_zone key zone=name:size rate=rate;

接下来,创建一个规则以将该区域应用于传入请求。可以首先使用location指令将规则仅应用于特定请求,也可以是服务器范围。突发选项将对超过速率限制的指定数量的请求进行排队,并且可以限制短时间的流量突发而不是返回错误。

  limit_req zone=name [burst=number] [nodelay];

超过速率限制且未在突发队列中保留的流量的默认响应代码为503(服务不可用)。可以设置204(无内容)等替代代码。

 limit_req_status code;

将所有这些放在一起是一个有效的配置,将位置块中的所有请求限制为每秒10次,缓冲区在返回错误之前排队最多50个请求并返回指定的204响应,如下所示:

http {

    ....

    limit_req_zone $hostname zone=limit:20m rate=10r/s;
    limit_req_status 204;

    server {

        ...

        location / {
            ...
            limit_req zone=limit burst=50;

        }

    }
}

实际上,服务器块可能位于http块中包含的不同文件中。为了清楚起见,我只是浓缩它们。

要测试,请使用泛洪工具或将请求率设置为10r / m(每分钟10次)并使用浏览器。检查日志并监控被拒绝的请求数量非常有用,这样您就可以了解对用户的任何影响。

可以组合多个limit_req_zone规则来指定宽松的全局限制,然后根据源IP限制更严格。这样可以在更广泛的用户群之前定位最持久的少数用户。