最近发现我们服务器的带宽经常会跑满,这样导致正常业务会收到影响。所以出于降低带宽峰值的原因,我开始研究nginx怎么限速的问题。
限制速度的方案,限制链接数和每个链接的速度
根据服务器业务的实际情况,有些可能不能设置链接数限制。我们这个服务都可以,所以下面的规则我设置的就比较严格。
第一步:在http块中添加类似下面的两个参数
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; #每秒处理10个请求,请求限制相关的实例名one limit_conn_zone $binary_remote_addr zone=addr:10m; # 连接数限制相关的实例名是addr
在http中添加的都像是实例化一个nginx对象,并给nginx对象赋初值。
第二步:在server块中添加实际限制数值
limit_conn addr 1; # 连接数限制是1,这个根据实际情况设置 limit_rate 50k; # 单个连接数的下载带宽控制在50KB/s limit_req zone=one burst=5 nodelay; # 请求连接队列中最多有5个待处理请求,多余请求直接返回503
设置完成后记得运行nginx -s reload重新载入
第三步:测试下载速度限制效果
通过浏览器下载,发现速度被限制在50KB/s,实现目标。
另外有几个情况说明
- 要想实现限速,还是我之前说的,单个连接带宽限制是必须的。
- 在生产环境中,建议不要使用连接数限制
- 单个连接的带宽限制不易过低
- 像迅雷这种下载器的限速,可能需要别的办法
限制用了一段时间发现没什么问题,带宽峰值也基本不会跑满了。最后总之需要根据自己实际情况来设置,不要因为这个影响业务,希望这篇文章对你有用。