目前很多站点目前在提供web页面访问的同时,也提供http软件或文件下载。但由于租用的IDC的线路的带宽不同,可能就有对于http下载速度的限制。很显然,这是必要的。假如要不限速的情况下,可能十几个人在高速下载的情况下就会把租用低带宽的主机的网络流量给占用到流量上限,近而造成web页面不能访问。这相原理类似于DDOS攻击了。而apache做为一个老牌的web服务器。提供这样的一个功能自不在话下。

一、下载安装

mod_bw并不是一个官方的模块。是由第三方提供的,不过受apache官方认可的。其下载页面为:http://ivn.cl/2010/01/06/downloads-for-bandwidth-mod/ ,目前针对linux/unix的最新版本是0.92 ,windows下的最新版是0.91 。

windows下的安装十分简单,将 mod_bw.dll 放到apache的modules目录下。编辑 httpd.conf,加入LoadModule bw_module modules/mod_bw.dll即可。linux下的安装也不难,只需要通过apxs或apxs2动态安装即可。方法如下:

1wget http://legacy.ivn.cl/files/source/mod_bw-0.92.tgz
2tar zxvf mod_bw-0.92.tgz
3apxs -i -a -c mod_bw.c 或
4apxs2 -i -a -c mod_bw.c

其他版本linux的安装方法,可以参看 http://legacy.ivn.cl/files/txt/mod_bw-0.92.txt 配置说明。

二、配置及参数

该模块虽然大小并不大,但配置参数却非常丰富,几乎我们想到的情况其都可以进行配置。该模块共有9个配置参数。

1、BandWidthModule [On|Off]

默认该模块是关闭的,BandWidthModule On可以开启他。

2、ForceBandWidthModule [On|Off]

预设不会过滤每个需求。如果开启他,他将处理过滤每个需求。

3、BandWidth [From] [bytes/s]

这边有两个参数。From 是限制来源的位置,也就是该位置受限制。他可以是完整的hostname、网域名称或IP。可搭配子网掩埋使用,例如 192.168.0.0/24 or 192.168.0.0/255.255.255.0 。另一个参数是限制的速率,以 bytes 每秒为单位;假如为 0,则不受限制。

4、MinBandWidth [From] [bytes/s]

这边也有两个参数,From的用法同参数3的一样,另一个参数每个连线限制的最小速率,以 bytes/s 为单位,-1 代表无限制。

5、LargeFileLimit [Type] [Minimum Size] [bytes/s]

Type 用于指明文件类型,可以使用 * 代表全部。也可使用 .tgz 、 .avi 等。Minimun Size 单位是 kbytes/s,只要超过这个 Size 就被规范在这个设定的限速中。最后一个参数就是被限制的速率!

6 – BandWidthPacket [Size]

可能您不需要去设定这个参数!预设值为 8192,适用于任何速度。这个设定必须介于 1024 至 131072。小的封包将使得速度变慢,且更耗费系统效能;相反亦是。

7、BandWidthError [Error]

这个选项是用来自定义错误讯息的。默认情况下,超过最大连接时,将会显示503错误。但用户往往不理解什么是503,你可以自订一个错误,错误号码从 300 至 599之间选择。在自订错误编码时请注意,要使用尚未被定义的号码!
例如:使用错误号码 510(510尚未被定义)

1ErrorDocument 510 /errors/maxconexceeded.html
2BandWidthError 510

8、MaxConnection [From] [Max]

max参数是设定最大的连接数。假如连接超过这个数量,Apache将显示503 Service Temporarily Unavailable错误。在设定这个参数之前,需先指定 BandWidth 值。他不需要设定的太低,您可以设定为无限制。

9、显示该模块的状态(该参数是从0.9版本后新增的)

配置如下:

1  <location>
2  SetHandler modbw-handler
3</location>

此时,可以通过http://127.0.0.1/modbw查看该模块的状态,也可以通过http://127.0.0.1/modbw?csv下载为csv文件查看目前的状态。通过该链接可以查看到id、name、lock、count、bw、bytes、hits几项内容。

三、示例

该模块相关参数可以设定在virtual host或directory配置内,也可以设定在全局配置httpd.conf文件内或.htaccess里!不过使用.htaccess 别忘了把httpd.conf 里的AllowOverride设为ALL 。

  1. 限制每个连接速度10kb/s 1. 限制每个连接速度10kb/s
1<virtualhost>
2      BandwidthModule On
3      ForceBandWidthModule On
4      Bandwidth all 10240
5      MinBandwidth all -1
6      Servername www.example.com
7    </virtualhost>
  1. 限制每一个连接 100 kb/s,最小的速率为 50kb/s,且当超过 500 kb时,限速为 50kb/s
1<virtualhost>
2    BandwidthModule On
3    ForceBandWidthModule On
4    Bandwidth all 1024000
5    MinBandwidth all 50000
6    LargeFileLimit * 500 50000
7    Servername www.example.com
8  </virtualhost>
  1. 限制 avi & mpeg 文件的下载速度为 20 kb/s
1 <virtualhost>
2      BandwidthModule On
3      ForceBandWidthModule On
4      LargeFileLimit .avi 1 20000
5      LargeFileLimit .mpg 1 20000
6      Servername www.example.com
7    </virtualhost>

4、当文件类型(mime)为 text 格式时,限制速度为 5kb/s

1<virtualhost>
2    BandwidthModule On
3    AddOutputFilterByType MOD_BW text/html text/plain
4    Bandwidth all 5000
5    Servername www.example.com
6  </virtualhost>

总结:

该模块主要用于对下载速度进行限制,如果想要对每个IP的连接数进行限制。还需要用到另一个模块mod_limits ,其项目托管在github上,页面为:https://github.com/hackman/mod_limits 。apache的其他模块可以通过https://modules.apache.org/查看。