速率限制时,如何configurationnginx返回429的http代码?

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

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

关于stackexchanged的这个(closures的) 问题表明可以使用error_page指令。 但是,如果确实存在服务器问题(而不是客户打我们太多),并且服务器应返回503服务不可用,我不想返回429。

有什么build议么?

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

我们有“limit_req_status”和“limit_conn_status”指令。 我只是在Gentoo Linux上testing它们(注意,你需要将模块limit_req和limit_con编译进去)。

有了这些设置,我认为你可以实现你所要求的:

limit_req_status 429; limit_conn_status 429; 

我已经快速validation了这一点:

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

由于nginx中的请求率高和configuration的限制,在激活指令后大多数请求失败:

 limit_req zone=api burst=15 nodelay; 

基于VBart的回应和其他评论,很明显,最好的select是把503错误映射到429s。

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

由于nginx(1.3.x)只能使用503个状态码作为limit_req和limit_conn,所以这应该是一个很好的方法。

除了limit_req和limit_conn之外,Nginx本身永远不会返回503。