答案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。