我想限制我的域中每个用户的 .flv 和 .mp4 文件的下载速度。我的页面每天有 1000-3000 名访问者,他们无法同时观看我的内容,因为 1-2 个人占用了我所有的带宽。
我想给每个用户 200KiB/s......
如果我的流有 10 个听众,那么他们使用 2Mib/s,而不是 30-40Mib/s...并且我想给他们一个最低限度..
我尝试了带宽模块,但它适用于域,而不适用于用户。
BandwidthModule 开启 ForceBandWidthModule 开启 LargeFileLimit .flv 1 204800 LargeFileLimit .mp4 1 204800
有没有容易安装的 apache 模块?或者我只能限制下载光纤?... 通过 IP 或连接限制下载速度...
答案1
看起来像mod_cband
可能是您最好的选择。该CBandRemoteSpeed
指令专门限制每个客户端 IP 的连接数、每秒连接数和连接速度。它似乎没有“每个文件类型”选项。根据文档,它是按文件类型设置的,<VirtualHost>
因此如果您只想限制 .flv 和 .mp4 文件,则需要将它们单独移动到虚拟主机(例如streaming.example.com
)并在那里启用 cband。
答案2
如果没有 Apache 内部解决方案,而我们这里讨论的是 Linux,那么可以使用流量整形来实现这一点。您所需要的只是能够(快速)向 Apache 外部传达相应进程属于某个用户的信息。也许您可以重写文件的 URL,以便 Apache 调用 PHP 脚本。该脚本将确定用户和进程 ID,并在发送请求的数据之前将两者写入一个小的“守护进程”(例如 Python 脚本)。这个守护进程将在 mangle 表中添加带有 --pid-owner 的 iptables 规则(不再起作用,见下文:编辑)并标记数据包(每个(活动)用户一个数字)。
您将为每个同时活动的用户定义一个 HTB 类。tc 过滤器将根据 iptables 设置的 nfmark 为每个数据包分配一个类。您可以决定这些类是否将 200KiB/s 作为硬限制或额外获得备用带宽。这样,无论用户打开了多少个连接,限制都是针对所有连接的。
有时“守护进程”必须检查所有进程是否仍然存在,并删除已经消失的进程规则。
编辑
似乎选项 --pid-owner 已从 iptables 中删除。基于用户或组进行过滤的可能性可能没有帮助。但 PHP 脚本知道目标地址,因此它可以使用这些参数调用脚本来创建相应的规则。