限速时,如何配置nginx返回429 http代码?


11

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

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

关于stackexchanged的这个(封闭的)问题表明可以使用error_page指令。但是,如果确实存在服务器问题(不是客户对我们的打击太大),并且服务器应该返回503 Service Unavailable ,则我希望返回429。

有什么建议?


仅供参考,我为此功能创建了一个增强请求,因为如果不将所有503映射到429则无法实现。
adambrod

Answers:


19

好消息,版本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;

1
..什么是“ ab2”?
XXL

ab是的工具apache2-utils。在ubuntu上是,ab但是在CentOs下是ab2
节食者

1

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

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

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


不是最佳选择。429是一个特定的用例,将所有潜在的503(服务不可用)映射为返回429对用户而言具有误导性且无效。例如,客户端可能会看到429并使用退避重试逻辑,但是如果503与节流无关,则无济于事。
艾迪(Eddie)

0

除了limit_req和limit_conn以外,Nginx本身从不返回503。


1
啊,那很有趣。因此,您说的是,如果我使用error_page将503替换为429,我将永远不会告诉客户太多请求,除非他们确实发送了太多请求?
adambrod

是的,是的,但只有一个例外,那就是您尚未(proxy/factcgi/scgi/uwsgi)_intercept_errors启用。nginx.org/r/proxy_intercept_errors
VBart 2013年

nginx服务的应用程序也可能返回503,这使得客户端很难看到是来自nginx的连接限制还是来自应用程序的服务器错误。
bbaja42 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.