当原始服务器以401状态代码响应时,我希望nginx通过user-ip进行速率限制。我将如何处理。我已经为普通的API调用设置了limit_req_zone
,看起来像这样:limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
,但我想进一步限制对未经授权调用我的API端点的违规者的等级。
编辑:我确实尝试过根据映射的变量将响应状态401映射到ip地址和速率限制,但这似乎无济于事。参见下面的代码。
map $status $limit {
default '';
401 $binary_remote_addr;
}
limit_req_zone $limit zone=api:10m rate=5r/s;
location /api {
limit_req zone=api burst=5;
...
}
顺序很重要。如果使用上游服务中的HTTP状态代码,则应将速率限制指令放在“ proxy_”指令之后。
例如,这应该起作用:
map $status $limit {
default '';
401 $binary_remote_addr;
}
...
...
...
limit_req_zone $limit zone=api:10m rate=5r/s;
...
...
...
server {
location /by-uri/myburst_401 {
proxy_pass http://example.com/;
limit_req zone=api burst=5 nodelay;
}
}
...
请注意proxy_pass指令后面的limit_req区域。这非常重要,否则映射将无法工作。这是因为$ status变量在调用上游之前仍然为空。