如何配置 nginx 以在速率限制时返回 429 http 代码?

如何配置 nginx 以在速率限制时返回 429 http 代码?

如何配置 nginx 以在节流/速率限制时返回 http 状态代码 429(请求过多)而不是默认的 503(服务不可用)?

仅供参考,我使用 nginx 作为反向代理,并使用 HttpLimitReqModule。429 状态代码的草案规范是RFC6585

这(已关闭)问题stackexchanged 上显示可以使用错误页面指令。然而,我如果确实存在服务器问题(而不是客户过多地打击我们),则要返回 429,而服务器应该返回 503 服务不可用。

有什么建议么?

答案1

好消息,版本 1.3.15 http://mailman.nginx.org/pipermail/nginx/2013-March/038306.html

我们有“limit_req_status”和“limit_conn_status”指令。我刚刚在 Gentoo Linux 上测试了它们(请注意,您需要将模块 limit_req 和 limit_con 编译进去)。

通过这些设置,我认为您可以实现您的要求:

limit_req_status 429;
limit_conn_status 429;

我已经通过以下方式验证了这一点:

ab2 -n 100000 -c 55 "http://127.0.0.1/api/v1

由于请求率过高以及 nginx 中配置的限制,激活该指令后大多数请求都失败:

limit_req zone=api burst=15 nodelay;

答案2

根据 VBart 的回复和其他评论,很明显最好的选择是将 503 错误映射到 429。

error_page 503 = 429 /too-many-requests.html

由于 nginx(1.3.x)仅对 limit_req 和 limit_conn 使用 503 状态代码,因此这应该是一种不错的方法。

答案3

Nginx 本身在除了 limit_req 和 limit_conn 之外的情况下绝不会返回 503。

相关内容