在现代互联网应用中,服务器的性能和响应速度是至关重要的。为了保证服务器的稳定性和可靠性,限制客户端对服务器的访问速度是一项重要的任务。而nginx 是一款高性能的 Web 服务器和反向代理服务器,提供了丰富的功能来管理和控制客户端请求。其中,http 响应限速功能就是是一种有效的方式,可以限制服务器端对客户端的响应速度,以避免服务器在运行过程中因为部分客户端占用过多的资源而导致网络和服务器负载过高,而引起服务的不稳定的问题。
本文首先介绍了如何进行nginx配置来启用限速功能,然后通过深入源码来详细分析nginx http响应限速的实现原理,让大家对nginx的限速的实现原理有一个完整的认识。
2. 配置参数
和响应限速有关的主要配置参数一共有两个,分别是limite_rate和limit_rate_after。
2.1 limit_rate 配置指令
语 法: limit_rate rate; 默认值: limit_rate 0; 上下文: http, server, location, if in location
本条配置指令用来限制响应传输速率,单位为每秒字节数,如果设置为0表示禁用限速功能。这个限制是对每个请求来说的(而不是对每个客户端来限制的),也就是说如果同一个客户端同时开启了两个链接,那么总的最大响应速率降是这个限制速率的两倍。
配置的参数值可以支持变量(从1.17.0版本开始)。这可能在限制的速率值依赖于某个条件的常见下面显得非常有用,譬如:
map $slow $rate { 1 4k; 2 8k;}limit_rate $rate;
上例利用map模块,将$slow变量的值映射为$rate变量的值,譬如$slow变量为1,那么映射出$rate为4k。这样子,limit_rate就可以根据$slow的值来设置最终要限制的响应速率了。
这样子,结合map模块的功能,我们完全可以让限速功能变得得更加灵活,譬如根据http header的某个值来映射速率,根据请求的url或者域名来限制速率等等,这里就不在赘述了。
2.2 limit_rate_after 配置指令
语 法: limit_rate_after size; 默认值:limit_rate_after 0; 上下文: http, server, location, if in location
备 注:
本条配置指令从0.8.0版本开始生效。
本条配置指令用来设置在给客户端发送的响应的字节数超过指定的值以后才开始限速。和limit_rate配置指令一样,从1.17.0版本开始,可以支持变量方式配置。
这样指令在流媒体播放的场景下面比较有用,为了支持播放器能够尽量缩短播放前的加载时间,我们就需要在刚开始的时候尽可能快速地将视频文件的头部发送给客户端;而等到播放器满足播放条件开始播放的时候,我们又不太希望播放器加载得太快从而浪费服务器的资源和网络资源,所以需要限制客户端的下载速度到某一个合理的值,只要保证播放器能够流畅播放即可。
而limit_rate_after的配置指令正好满足的这个场景的需求。
2.3 其他限速配置
nginx还可以支持通过设置$limit_rate变量参数来对响应速度进行限制,这样就可以在nginx的运行过程中,由脚本或者插件动态设置响应速率,这样子限速逻辑更加灵活了。不过,从1.17.0版本开始,nginx官方不推荐使用这个方法。
nginx还支持上游服务器通过X-Accel-Limit-Rateheader头来告诉nginx对本次响应进行限速多少的功能。这里不再赘述。