我想将传入的请求限制为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
响应进行响应。
按传入请求的百分比控制也可以。
感谢。
答案 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限制更严格。这样可以在更广泛的用户群之前定位最持久的少数用户。