当前位置: 首页 > 工具软件 > limitipconn > 使用案例 >

Apache带宽与并发联接数的控制(mod_limitipconn+bw_mod)

苏德容
2023-12-01

给大家推荐两个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



 类似资料: