本文旨在帮助读者理解和配置 Nginx 的 HTTP 响应限速功能,并通过分析源码来揭示其实现原理。
1. Nginx HTTP 响应限速配置
1.1 配置参数
有两大主要配置参数与响应限速相关limit_rate 和 limit_rate_after。
1.1.1 limit_rate 配置指令
语 法: limit_rate rate;
默认值: limit_rate 0;
上下文: http, server, location, if in location
此配置指令用于限制响应传输速率,单位为每秒字节数。如果设置为 0,表示禁用限速功能。这个限制是针对每个请求的,也就是说如果同一个客户端同时开启了两个链接,那么总的最大响应速率将是这个限制速率的两倍。
从 Nginx 1.17.0 版本开始,limit_rate 配置指令支持变量。这使得根据特定条件动态设置限速值成为可能。例如
nginx
map $slow $rate {
1 4k;
2 8k;
}
limit_rate $rate;
在上面的例子中,map 模块将 $slow 变量映射到 $rate 变量,从而可以根据 $slow 的值来设置不同的限速值。这使得限速功能更加灵活,可以根据 HTTP 头、URL 或域名来限制速率。
1.1.2 limit_rate_after 配置指令
语 法: limit_rate_after size;
默认值: limit_rate_after 0;
上下文: http, server, location, if in location
此配置指令从 Nginx 0.8.0 版本开始生效。它用于设置开始对客户端响应进行限速的条件只有当发送给客户端的响应字节数超过指定值后,才开始限速。这对于流媒体播放的场景非常有用,可以确保在播放器加载视频文件头部时不会受到限速的影响。
从 Nginx 1.17.0 版本开始,limit_rate_after 配置指令也支持变量。
1.2 其他限速配置
Nginx 还支持通过 $limit_rate 变量来动态设置响应速度,这使得限速逻辑更加灵活。然而,从 Nginx 1.17.0 版本开始,官方不再推荐使用这种方法。
此外,上游服务器可以通过 X-Accel-Limit-Rate HTTP 头来告诉 Nginx 对本次响应进行限速。
2. Nginx HTTP 响应限速的实现原理
为了理解 Nginx HTTP 响应限速的实现原理,我们需要深入 Nginx 的源码。Nginx 使用了一个 ngx_http_limit_rate_module 模块来实现限速功能。这个模块通过一个定时器和一个计数器来控制发送给客户端的数据的速度。
当 Nginx 接收到客户端的请求时,它会计算自上次请求以来已经发送了多少字节,然后与限速值进行比较。如果超过限速值,Nginx 会等待一段时间,然后再发送更多的数据。这个等待时间是通过定时器实现的,它会周期性地检查是否可以继续发送数据。
在 Nginx 源码中,ngx_http_send_header 函数负责设置响应的头部,而 ngx_http_write_filter 函数则负责实际的数据传输。ngx_http_limit_rate 函数用于计算是否需要限制当前请求的响应速度,如果需要,它会设置一个标志位,指示 ngx_http_write_filter 函数应该等待一段时间后再发送数据。
在 ngx_http_write_filter 函数中,如果设置了限速标志位,它会调用 ngx_http_limit_rate_ctx 函数来检查是否可以继续发送数据。如果