Nginx带宽控制(限速模块使用)
程序员文章站
2022-06-13 19:18:12
有个老项目,通过 squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 squid,于是盘算着是不是能在 nginx 里找到类...
有个老项目,通过 squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 squid,于是盘算着是不是能在 nginx 里找到类似的功能。
好消息是 nginx 提供了 和,举个例子来说明一下:
复制代码 代码如下:
location /download/ {
limit_rate_after 500k;
limit_rate 50k;
}
大概意思是:用户下载达到 500k 后,便控制其速度在 50k 以内。
坏消息是此控制是针对单个连接而言的。换言之,只能限制单个连接的带宽,不能限制总带宽。不过使用模块的话,可以在一定程度上缓解问题:
复制代码 代码如下:
limit_conn_zone $server_name zone=servers:10m;
server {
location /download/ {
limit_conn servers 1000;
limit_rate_after 500k;
limit_rate 50k;
}
}
通过 limit_conn 限制了并发连接数,于是也就限制了总带宽。可惜这个解决方式并不完美,大家可以设想如下的例子:1000 个用户能够同时以 50k 的速度下载;那么在总带宽不变的情况下,2000 个用户是否能够同时以 25k 的速度下载?从业务的角度看,答案自然是肯定的,可实际上 limit_conn 和 limit_rate 不够灵活,无法简单实现此类逻辑。
当然,问题肯定有办法解决。比如使用第三方模块:;还可以使用 linux 内置的 tc 命令。limit_speed 比较简单,不多说了,接下来我们就看看 tc 的用法吧:
复制代码 代码如下:
shell> tc qdisc add dev eth0 root handle 1: htb default 10
shell> tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
shell> tc filter add dev eth0 protocol ip parent 1:0 prio 1 \
u32 match ip dport 80 0xffff flowid 1:1
tc 复杂的让人发疯,请参考:linux advanced routing & traffic control howto。
本文介绍了多个 nginx 方面的模块,实际上还有一个 模块也超赞,虽然和本文关系不大,但建议大家了解,具体可以参考「」。
推荐阅读
-
Nginx中gzip_static模块的使用
-
PHP没有数据库连接池怎么破?PHP环境下使用Nginx ngx_http_limit_req_module模块的高负载解决方案_PHP教程
-
详解nginx使用ssl模块配置HTTPS支持
-
nginx使用nginx-rtmp-module模块实现直播间功能
-
FastDFS结合Nginx Image 模块使用缩略图
-
nginx使用ssl模块配置HTTPS支持
-
nginx使用ssl模块配置HTTPS支持,
-
使用Lua编写Nginx服务器的认证模块的方法
-
Linux系统中安装使用Trickle来控制用户带宽
-
nginx中使用nginx-http-concat模块合并静态资源文件