当原始服务器以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;
    ...
}

最佳答案

这非常棘手,因为在声明limit_req_zone时,$ status变量为空。仅在nginx处理了请求之后,才知道$ status。例如在proxy_pass指令之后。

我可以通过状态最接近实现速率限制的方法是:

...
...
...
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
...
...
...
server {
    location /mylocation {
        proxy_intercept_errors on;
        proxy_pass http://example.org;
        error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 421 422 423 424 426 428 429 431 451 500 501 502 503 504 505 506 507 508 510 511 @custom_error;
    }

    location @custom_error {
        limit_req zone=api burst=5 nodelay;
        return <some_error_code>;
    }

}
...



缺点是这种方式必须返回与代理通过响应不同的状态码。

关于node.js - Nginx-原始服务器响应代码为401时的速率限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49332103/

10-09 15:26