【介绍】
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