给大家推荐两个Apache模块,一个是mod_limitipconn,用来控制Apache的并发联接数,通过该模块可以限制同一来源IP的并发联接数。另一个模块是bw_mod,用于Apache网站带宽控制,可以根据来源IP,网段来划分带宽,也可以根据网站文件类型来限制带宽,参数比较灵活,可以根据自己实际情况进行调整。
mod_limitipconn官方网址为:http://dominia.org/djao/limitipconn.html
mod_mod官方网址为:http://ivn.cl/apache/
具体安装及配置过程就不介绍了,可以参见官方使用说明,这里只简单地谈谈使用心得。
一、对于mod_limitipconn,其实该模块不仅提供客户端并发联接数的控制能力,从安全角度来说还可以起到对抗固定来源IP地址发起的DOS攻击,包括来源固定的大量访问请求型攻击(大量GET或POST请求型的攻击),当同一来源IP地址的联接数超过限定的值后,会弹回对方的访问请求,给对方一个“503服务临时无效”的响应。当Apache服务器受到大量的访问请求型攻击的时候,由于大量的Apache进程及PHP和MYSQL运行消耗,会导致服务器资源迅速耗尽,网站打开缓慢或瘫痪。如果是此种类型的攻击,使用mod_limitipconn模块则可以有效地提升服务器的抗攻击能力,因为大量的请求被弹回,节省了服务器运行PHP及MYSQL的性能消耗。当然只要请求进了80端口,不管是接受还是弹回请求,Aapche都有运行成本,所以此方法只能是减轻而无法解决,毕竟应用层的处理效率是比较低的。
二、对于网站访问量比较大、使用了mod_limitipconn模块且限制同一客户端并发联接数低于3的情况下,如果用Apache默认的配置参数,极可能经常出现“服务临时无效”的提示。因为Apache默认是设置“KeepAlive on”,且“KeepAliveTimeout 180”,所以一旦建立联接,那么在3分钟内这个联接是不会被释放的。所以如果网站不同页面点击频率比较高或图片资源比较多的话,会经常出现服务临时无效的提示。那么有两种方式去解决,一是加大并发联接数的量,比如设置为普通站点10个并发联接数,图片站点则20个。另一种方式就是如果你不想加大这个值的话,可以设置KeepAlive为off,然后缩短Timeout时间,这样联接会很快被释放出来。具体情况根据需要去调整测试,以得到一个最适合自己站点情况的值。
三、如果要同时限制并发联接数与带宽的话,就用bw_mod+mod_limitipconn,因为虽然bw_mod也可以控制并发联接数,但他是针对某个目录或整个网站的并发联接数,是用来控制服务器端的总联接数,比如设置MaxConnection all 1000,那么这个网站所能接受的最大并发联接数为1000,而并不是限制每一客户端的并发联接数,而mod_limitipconn则是针对同一来源IP的客户端的并发联接数,所以这两者的联接数限制是有所区别的。
四、个人感觉用了bw_mod及mod_limitipconn模块后,网站访问速度有所下降,能凭直观地感觉出来,并且CPU的负载有所上升。特别是在网站访问量比较大的情况下,这两个模块会消耗一定的主机性能,所以轻重权衡这个得大家自己根据情况来采用了。另外bw_mod里有个参数是用来设置控制精度与频率的,默认是1000毫秒,如果你想提高带宽控制精度就改小这个数值,但会消耗更多的CPU资源,反之亦然,降低精度可提升性能。
Apache并发联接数的控制
http://dominia.org/djao/limit/mod_limitipconn-0.22.tar.gz
#tar zxvf mod_limitipconn-0.22.tar.gz
#cd mod_limitipconn-0.22
假如apxs路径为/usr/sbin/apxs
#/usr/sbin/apxs -c -i -a mod_limitipconn.c
#vim /usr/local/apache2/conf/httpd.conf
将#ExtendedStatus On 去掉注释
添加
<IfModule mod_limitipconn.c>
# Set a server-wide limit of 10 simultaneous downloads per IP,
# no matter what.
<Location />
# This section affects all files under http://your.server/somewhere
MaxConnPerIP 1
# exempting images from the connection limit is often a good
# idea if your web page has lots of inline images, since these
# pages often generate a flurry of concurrent image requests
NoIPLimit image/*
</Location>
<Directory /home/*/public_html>
# This section affects all files under /home/*/public_html
MaxConnPerIP 1
# In this case, all MIME types other than audio/mpeg and video*
# are exempt from the limit check
OnlyIPLimit audio/mpeg video
</Directory>
</IfModule>
Apache设定下载速度限制\
-------------------------------------------------------
#tar xvf mod_bw-0.8.gz
# cd mod_bw
# /opt/apache/bin/apxs -ac mod_bw.c
# gcc -shared -p /opt/apache/module/mod_bw.so mod_bw.o
#/opt/apache/bin/apxs -i -a -c mode_bw.c
创建 mod_bandwidth 运行需要的目录:
mkdir /tmp/apachebw
mkdir /tmp/apachebw/link
mkdir /tmp/apachebw/master
chmod -R 777 /tmp/apachebw
然后在apache配置文件里面按照需要添加限制即可。
<VirtualHost *:80>
DocumentRoot "/usr/local/apache2/htdocs"
ServerName root@localhost
BandWidthDataDir "/tmp/apachebw/"
BandwidthModule On
ForceBandWidthModule On
Bandwidth all 1024000
MinBandwidth all 50000
LargeFileLimit * 500 100000 // *表示文件类型,所有大于500k的文件下载速度100k , 这里我当时以为两个单位一样的。。。
</VirtualHost>
附录:
mod_bandwidth选项简单说明:
BandWidthDataDir
格式: BandWidthDataDir
默认: "/tmp/apachebw"
上下文: server config
设置 mod_bandwidth 保存运行时数据的目录。需要在该目录下创建 ./master
和 ./link 两个子目录,并设置为权限为 777。
注意:有些系统会定时清理 /tmp 目录,所以在这些系统上最好把
BandWidthDataDir 设置到其他地方。
BandWidthPulse
格式: BandWidthPulse <毫秒(千分之一秒>;
默认: 1000
上下文: per server config
改变计算带宽的时间间隔,默认为1000毫秒(1秒)。使用更低的间隔可以获得
更精确的带宽控制,但消耗更多的CPU时间,反之亦然。
BandWidth
格式: BandWidth <domain|ip|all>; <速率>;
默认: 无
上下文: per directory, .htaccess
限制这个目录下文件下载的速率。
domain 指定来自哪个域的连接受到这个设置的影响。
ip 指定来自哪个ip地址(或者ip段)的连接受到影响。
all 所有连接都受到影响。
示例:
<Directory />;
# 来自 idcfree.com 的连接不限制下载速度
BandWidth idcfree.com 0
# 来自 192.168.0.0/16(或者192.168.0) 网段的连接不限制下载速度
BandWidth 192.168.0.0/16 0
# 其他连接限制下载速度为每秒1024字节
BandWidth all 1024
# 越前面的设置优先权越高
</Directory>;
LargeFileLimit
格式: LargeFileLimit <文件类型 > <文件大小> <速率>
默认: 无
上下文: per directory, .htaccess
对于超过指定大小的文件,下载时使用的速率。如果速率设置0即不限制速度,
但下载速度仍然要受到BandWidth设置的影响。如果设置成-1,则完全不受影响。
通过设置不同的文件大小和速率,可以设置不同大小范围内文件的下载速度。
示例:
文件尺寸大于等于500千字节的文件,下载速率为每秒4096字节
我的测试结果是:文件下载到500kb后就不再下载,不知道有什么解决办法....此外下载速度受到BandWidth设置的影响
LargeFileLimit * 500 4096
<Directory />
LargeFileLimit * 100 1024
</Directory>
LargeFileLimit .rar 30 23000
#限制所有大于30K的后缀名为.rar的文件的速率为23000字节/秒,即23K/秒
LargeFileLimit .mp3 30 23000
LargeFileLimit .wav 30 23000
LargeFileLimit .jpg 10 27000
LargeFileLimit .gif 5 27000
LargeFileLimit .zip 50 30000
LargeFileLimit .sis 50 30000
LargeFileLimit .exe 50 30000
MaxConnection
格式: MaxConnection <连接数>;
默认: 0 (不限制)
上下文: per directory, .htaccess
当超过指定连接数时,拒绝新的连接。
对192.168.3.49的ip地址的用户,并发连接数不超过2
对所有访问服务器的用户,服务器的最大连接数20
MaxConnection 192.168.3.49 2
MaxConnection all 20
MinBandWidth
格式: MinBandWidth <domain|ip|all>; <速率>;
默认: all 256
上下文: per directory, .htaccess
设置最小带宽,默认为每秒256字节。根据BandWidth和LargeFileLimit设置的速
率。mod_bandwidth会计算允许的连接数。例如BandWidth为4096字节,而
MinBandWidth为1024字节,则最大并发连接数为4。
限制某目录下的带宽
<Directory "/usr/local">
BandWidthModule On
BandWidth all 1024
</Directory>
顺便附上单位转换。
位(bit,简写:b)
字节(Byte,简写:B);1Byte=8bit
千(Kilo,简写:K); x1,000
兆(Mega,简写:M); x1,000,000 =1000K
吉(Giga,简写:G); x1,000,000,000 =1000M
梯( 简写:T); x1,000,000,000,000 =1000G
由于计算机系统为二进制算法,实际进位为1024,有时计算容量时又忽略小数字,记为1000进位。因此会出现显示字节数和标称字节数有差别。
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB