怎样安装带宽限制模块mod_bandwidth

2018年12月11日 | 分类: 【技术】

【介绍】

mod_bandwidth可以对IP的并发数进行控制,也可以对下载流量进行控制,也可以对某个目录的流量进行控制。

官网:http://bwmod.sourceforge.net/
下载:http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz

【安装】

wget http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz && tar zxvf mod_bw-0.7.tgz && cd mod_bw
/usr/local/apache2/bin/apxs -c -i mod_bw.c

【配置】

编辑httpd.conf文件:

LoadModule bw_module modules/mod_bw.so

如果想限制虚拟主机的带宽,在 Virtualhost 中设置:

<virtualHost *:80>
        ServerName vhost1.cszhi.com
        DocumentRoot    /var/www/vhost1
        BandwidthModule On
        ForceBandWidthModule On
        Bandwidth all 1024000
        MinBandwidth all 50000          #每个客户端最高速度可达50KB
        LargeFileLimit * 500 50000
        MaxConnection all 6
</virtualHost>

其它参数事例说明,详细的见源码包里的mod_bw.txt:

BandWidth localhost 0                                      #对localhost不限速
BandWidth 192.168.1.5 102400                       #对192.168.1.5限速为100KB
BandWidth “u:^Mozilla(.*)” 10240              #用mozilla时限速10KB
BandWidth “u:wget” 102400                      #如果用wget下载时限速10KB
MinBandWidth all -1                                      #保证每个客户端最高速度可达10KB
LargeFileLimit .jpg 100 10240                      #jpg文件超过100KB,限速10KB
#下面的510挺好,如果不设置,apache自己会报错,就根报404差不多,页面非常的丑
ErrorDocument 510 /exceed_speed.html
BandWidthError 510
MaxConnection all 10                                       #所有ip最大连接数为10
MaxConnection 192.168.1.5 5                         #192.168.1.5最大连接数为5

然后重启Apache服务器。

【测试】

使用mod_bw.so模块后,将阻止超限的带宽。

【排错】

报错1:

参考:http://httpd.apache.org/docs/2.4/developer/new_api_2_4.html
参考:https://blog.csdn.net/daizikai77/article/details/71191547
参考:https://www.cnblogs.com/lin3615/p/5618987.html

当 Apache2.4.x 报错:

/mnt/vdd/mod_bw.c: In function 'get_bw_rate':
/mnt/vdd/mod_bw.c:567:59: error: 'conn_rec' has no member named 'remote_addr'
if (apr_ipsubnet_test(e[i].x.ip, r->connection->remote_addr)) {

这个错误是由于 Apache2.2 到 2.4 api有所改变。

解决办法:编辑 mod_bw.c ,把所有的 remote_ip 替换为 client_ip ;把 remote_addr 替换为 client_addr 。

然后重新编译:

/usr/local/apache2/bin/apxs -c -i mod_bw.c

报错2:

参考:https://blog.csdn.net/lgq421033770/article/details/44673237

添加完mod_bw.so模块,重启Apache时报错:

Stopping httpd:                                            [FAILED]
Starting httpd: httpd: Syntax error on line 203 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_bw.so into server: /etc/httpd/modules/mod_bw.so: undefined symbol: apr_atomic_cas
                                                           [FAILED]

需要修改一下 mod_bw.c :

#ifdef APR_MAJOR_VERSION   //添加这行
#if (APR_MAJOR_VERSION < 1)
    #define apr_atomic_inc32 apr_atomic_inc
    #define apr_atomic_dec32 apr_atomic_dec
    #define apr_atomic_add32 apr_atomic_add
    #define apr_atomic_cas32 apr_atomic_cas
    #define apr_atomic_set32 apr_atomic_set
#endif
#endif  //添加这行

重新编译:

/usr/local/apache2/bin/apxs -c -i mod_bw.c