nginx 429 Too Many Requests 返回说明

13 min read

在HTTP协议中,响应状态码 429 Too Many Requests 表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”。

在响应中,可以提供一个 Retry-After 首部来提示用户需要等待多长时间之后再发送新的请求。

状态 429 Too Many Requests

示例

HTTP/1.1 429 Too Many Requests Content-Type: text/html Retry-After: 3600

nginx 访问限制

使用的模块limit_req_zone ,limit_req_conn

  • limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"

  • limit_req_conn 用来限制同一时间连接数,即并发限制

例子:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

示例

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
	location /search/ {
		limit_req zone=one burst=5 nodelay;
}

第一段配置

第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址 第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的

第二段配置

第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应 第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内 第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队

什么是漏桶算法?

我们假设系统是一个漏桶,当请求到达时,就是往漏桶里“加水”,而当请求被处理掉,就是水从漏桶的底部漏出。水漏出的速度是固定的,当“加水”太快,桶就会溢出,也就是“拒绝请求”。从而使得桶里的水的体积不可能超出桶的容量。主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。