使用mod_limitipconn模块限制同一IP的连接数

1、在http://dominia.org/djao/limitipconn2.html上下载对应的版本,我下载的是for apache 2.2的版本(mod-limitipconn-0.23.tar.bz2)。

2、安装(可查看INSTALL);

#tar xjvf mod_limitipconn-0.23.tar.bz2
#cd mod_limitipconn-0.23
#make install

该步骤会自动将mod_limitipconn.so编译到apache对应的modules目录中,还会在httpd.conf文件中自动添加loadmodules语句。

3、修改httpd.conf文件完成配置,For example:

# This command is always needed
ExtendedStatus On

# Only needed if the module is compiled as a DSO
LoadModule limitipconn_module lib/apache/mod_limitipconn.so

<IfModule mod_limitipconn.c>

   # Set a server-wide limit of 10 simultaneous downloads per IP,
   # no matter what.

   MaxConnPerIP 10

   <Location /somewhere>
      # This section affects all files under http://your.server/somewhere
      MaxConnPerIP 3

      # 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>

在这之中,有如下几点是需要注意的:

a、mod_status一定要加载,且httpd.conf中的ExtendedStatus选项要打开。
b、如果要限制特定目录,请使用如下格式:
<Location />
    # global per-directory settings here
    <Location /somewhere>
    # local per-directory settings here
    </Location>
</Location>
c、若使用了mod_cache模块,则mod_limitipconn对特定目录的限制无效,只能通过全局参数来限制。(不太理解)
d、对连接数的限制是针对所有IP的,不能针对个别IP进行限制。
e、如果有客户端的超过了限制,则会报503错误。
f、 可以将超过连接数的访问记录到access.log中。

相关详情请见http://dominia.org/djao/limitipconn2-README
我的设置如下:
ExtendedStatus On
<IfModule limitipconn_module>
       <Location />
       MaxConnPerIP 3
       NoIPLimit image/*
       </Location>
       <Location /mp3>
       MaxConnPerIP 1
       OnlyIPLimit audio/mpeg video
       </Location>
</IfModule>

4、测试:

刚开始陷入了一个误区,以为可以直接使用ab测试并发数,其实ab是用来测试apache的性能。Ab只能反应服务器是否响应了客户端的请求,而不关心服务器是不是拒绝为客户端服务。
测试同一IP的最大连接数的关键是查看apache的access_log,但需要如ab或多线程下载工具来配合测试,如我设置的MaxConnPerIP 3,刚我可使用如下命令来测试,ab –n 50 –c 10 127.0.0.1/,查看access_log可看到如下信息:

127.0.0.1 - - [10/Jan/2009:18:43:07 +0800] "GET /index.html HTTP/1.0" 503 323
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 200 44
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 200 44
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 200 44
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 503 323
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 503 323
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 503 323
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 503 323
127.0.0.1 - - [10/Jan/2009:19:01:16 +0800] "GET / HTTP/1.0" 503 323
则说明mod_limitipconn设置成功,服务器对同一IP的最大并发数为3。
由于对ab的机制的不了解,从一个误区跳到了另一个误区,上述测试的结果是不准确的,测试同一IP最大连接数最直接最简单的方法是:放一个较大的文件(如电影)到DocumentRoot中,然后通过迅雷来下载该文件,然后观察apache对迅雷多线程的反应,我的迅雷默认有5个线程,但只有3个线程读取数据,与设置相符,修改MaxConnPerIP的值后测试,测试结果也与之相符。MaxConnPerIP的值为0时,表示对连接无限制。



----------------------------------------------------------------------------------





1.构建过程说明
进行ip链接限制利用了apache的module--->mod_limitipconn
具体网址:http://dominia.org/djao/limitipconn.html
apache的modyle查询网址:http://modules.apache.org
系统说明:redhat ad server2.1 apache1.3.27
2.构建过程
构建过程是基于apache启用dso(dynamic shared objects )模式.
也就是你在编译apache的时候加入了--enable-module=so这个参数
构建的时候你无需停止你的apache服务...这个就是dso的方便之处:)
为了便于理解
这里把apache安装的目录叫做/apache-root
apache的源码目录叫做/apache-src
1)
把下裁到的mod_limitipconn-0.04.tar.gz解压到一个目录
tar -zvxf mod_limitipconn-0.04.tar.gz
这样mod就被解压到它所在地目录了...
2)
利用apxs把mod_limitconn.c编译成so为后缀的模块,并由程序自动修改apache的conf和cp模块到/apache-root/libexec,并设置正确权限(全自动完成)
cd mod_limitipconn-0.04
/apache-root/bin/apxs -i -a -c mod_limitconn.c
3)
利用phpinfo();函数查看apache当前的mod情况...(用vi编辑一个只有<? phpinfo(); ?>的php)
如果没有mod_status那么手动增加
增加方法如下:
为apache增加server-status的支持...
cd /apache-src/src/modules/standard
/apache-root/bin/apxs -i -a -c mod_status.c
注:一般都有mod_status了...:)所以上面步骤可选...
4)
修改apache的配置文件,配置文件在/apache-root/conf/httpd.conf
检查里面是否有下面的句子
LoadModule limitipconn_module libexec/mod_limitipconn.so
#LoadModule status_module libexec/mod_status.so //手动增加mod_模块要加这行
AddModule mod_limitipconn.c
#AddModule mod_status.c //手动增加mod_模块要加这行
并且
ExtendedStatus On
段要为on的设置,默认是off
还要在httpd.conf的最后加入
##############
#new add conf#
##############
<IfModule mod_limitipconn.c>
<Location />
MaxConnPerIP 6
# 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/* //image文件不受限制...包括gif,jpg等...
</Location>
# <Location /mp3>
# MaxConnPerIP 1
# # In this case, all MIME types other than audio/mpeg and video*
# # are exempt from the limit check
# OnlyIPLimit audio/mpeg video
# </Location>
#</IfModule>
##################
#new add conf end#
##################
MaxConnPerIP 6说明限制每个ip为6个链接....
5)
确认conf是不是正确
/apache-root/bin/apachectl configtest
restart apache
/apache-root/bin/apachectl restart
6)
自己想个办法测试了...:)
更多信息查看官方网站的介绍..:)

你可能感兴趣的:(apache,多线程,C++,c,C#)