我想将传入的请求限制为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 "";
}
}
Run Code Online (Sandbox Code Playgroud)
我想控制我在上游服务器上看到的请求数量.对于所有其他请求,我希望nginx响应204响应.
按传入请求的百分比控制也可以.
谢谢.
Nginx在使用limit_req_zone和limit_req 限制请求方面非常有效.
首先创建一个已定义限制的区域.对于全局限制,区域的密钥可以是静态的,也可以使用诸如源IP地址之类的变量作为区域的密钥,这对于限制特定IP或网站上较慢的页面非常有用.速率可以在每秒或每分钟的请求中定义.
limit_req_zone key zone=name:size rate=rate;
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个规则以将该区域应用于传入请求.可以首先使用location指令将规则仅应用于特定请求,也可以是服务器范围.突发选项将对超过速率限制的指定数量的请求进行排队,并且可用于限制短突发流量而不是返回错误.
limit_req zone=name [burst=number] [nodelay];
Run Code Online (Sandbox Code Playgroud)
超过速率限制但未保留在突发队列中的流量的默认响应代码是503(服务不可用).可以设置204(无内容)等替代代码.
limit_req_status code;
Run Code Online (Sandbox Code Playgroud)
将所有这些放在一起是一个有效的配置,将位置块中的所有请求限制为每秒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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,服务器块可能位于http块中包含的不同文件中.为了清楚起见,我刚刚将它们浓缩了.
要进行测试,请使用泛洪工具或将请求率设置为10r/m(每分钟10次)并使用浏览器.检查日志并监控被拒绝的请求数量非常有用,这样您就可以了解对用户的任何影响.
limit_req_zone可以组合多个规则来指定松散的全局限制,然后根据源IP限制更严格.这样可以在更广泛的用户群之前定位最持久的少数用户.
| 归档时间: |
|
| 查看次数: |
839 次 |
| 最近记录: |