正题:最近我发现服务器上有几个下载文件,有人没玩没了的开多线程下载,于是想要限制一下,于是就有下面的说明。
由于MaxClients只限制总的连接数,所以为了保证服务器不被少数的ip拖死,比如爬虫,就需要限制单个ip的并发连接数
一般使用mod_limitipconn和mod_bandwidth两个模块
一个控制连接数一个控制带宽,具体在apache1.x下,需要mod_limitipconn和mod_bandwidth俩模块配合才能实现,而在apache2下,只需要libapache2-mod-cband就完成以上两个模块的功能,cband模块主页:http://cband.linux.pl/
以上三个软件我都有在服务器上实际运行过,根据我的经验看,cband肯定比mod_limitipconn和mod_bandwidth两个模块配合使用更强,因为cband既可以对单个ip用户进行限制,还可以对某个虚拟主机限制或者不限制,还可以用直观的图形分析,还有流量控制,还有一定周期的流量自动清空,cool!
但是cband现在貌似还有不少bug,比如debian6上apt方式安装的apache,通过编译后的cband,加载到apache中运行会有错误,
具体的错误是:
apache2: Syntax error on line 204 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/cband.load: Cannot load /usr/lib/apache2/modules/mod_cband.so into server: /usr/lib/apache2/modules/mod_cband.so: undefined symbol: truncf
Action 'configtest' failed.
The Apache error log may have more information.
failed!
网上说的解决办法不管用,但是在debian5上同样方式安装就是可以成功的。
所以以下我的环境分别是:
debian 5 上安装cband
debian 6上安装mod_limitipconn和mod_bandwidth
先看cband的安装配置
apt-get install apache2-prefork-dev //实际是安装apxs
wget http://cband.linux.pl/download/mod-cband-0.9.7.5.tgz
tar xzvf mod-cband-0.9.7.5.tgz
cd mod-cband-0.9.7.5
./configure //如果还是找不到apxs请这样./configure --with-apxs=/usr/bin/apxs2 //指定一下 apxs的路径,否则可能会出错
make
make install 返回如下结果,没有关系
chmod 644 /usr/lib/apache2/modules/mod_cband.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
make: *** [install] Error 1
你看看,你看看,出现这么大的错误,但是不影响我们使用,下面手动加载进去就可以了。
在/etc/apache2/mods-available新建一个cband.load
内容如下:
LoadModule cband_module /usr/lib/apache2/modules/mod_cband.so
保存
然后输入a2enmod
输入cband即可启用该模块
重启apache
/etc/init.d/apache2 restart
现在已经生效了,接下来就是配置
在httpd.conf中加入下面这段,表示全局可以通过http://www.blogguy.cn/cband-status或者http://www.blogguy.cn/cband-status-me查看当前的cband状态
#cband配置
<IfModule mod_cband.c>
<Location /cband-status>
SetHandler cband-status
</Location>
<Location /cband-status-me>
SetHandler cband-status-me
</Location>
</IfModule>
转载请注明来源是www.blogguy.cn 超级鄙视去版权的所谓高手
接下来的配置就要到虚拟主机的配置文件中了
CBandRemoteSpeed 50kb/s 8 6 单个用户最大速度50kbps,每秒最多8个请求,同时发起连接不超过6个。
其他的配置说明不是很对我有需要,我也不是很熟悉,先就省略吧,自己去看说明文件。
截图看看
<img border="0" alt="" 大小:="" 80.69="" k"="" src="http://www.blogguy.cn/attachments/date_201104/thumb_4016facdc7af715a3038adad378e5900.jpg" _xhe_src="http://www.blogguy.cn/attachments/date_201104/thumb_4016facdc7af715a3038adad378e5900.jpg" width="550" height="342">
好了,接下来整整mod_limitipconn和mod_bandwidth
先来limitipconn
wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
tar xjvf mod_limitipconn-0.23.tar.bz2
cd mod_limitipconn-0.23
make install 出现错误apxs -c mod_limitipconn.c
make: apxs: Command not found
make: *** [mod_limitipconn.so] Error 127
修改目录下的Makefile文件
APXS=apxs改成APXS=apxs2因为apache2-prefork-dev安装的路径是/usr/bin/apxs2而不是apxs在,这个问题我在网上看到很多。先确定自己安装apxs 没有安装的apt-get install apache2-prefork-dev先安装
重新运行
make install
chmod 644 /usr/lib/apache2/modules/mod_limitipconn.so
[preparing module `limitipconn' in /etc/apache2/mods-available/limitipconn.load]
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "zh_CN:zh",
LC_ALL = (unset),
LANG = "us_EN"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Enabling module limitipconn.
Run '/etc/init.d/apache2 restart' to activate new configuration!
好了
/etc/init.d/apache2 restart
修改/etc/apache2/httpd.conf
增加mod_limitipconn控制
<IfModule mod_limitipconn.c>
<Location />
MaxConnPerIP 10 //设置比较大,就是为了客户访问没有问题,真正想攻击者对10个并发连接数也没有太大办法吧www.blogguy.cn
NoIPLimit image/*
</Location>
</IfModule>
服务器上搞一个大文件,用迅雷拖一下就知道是不是生效。
如果超出并发连接数会出现下面的错误
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.2.16 (Debian) Server at www.blogguy.cn Port 80
接下来是mod_bandwidth
这个有一个libapache2-mod-bw
apt-get install libapache2-mod-bw安装就可以了
The following NEW packages will be installed:
libapache2-mod-bw
0 upgraded, 1 newly installed, 0 to remove and 5 not upgraded.
Need to get 21.4 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Get:1 http://ftp.debian.org/debian/ squeeze/main libapache2-mod-bw i386 0.91-1 [21.4 kB]
Fetched 21.4 kB in 4s (4344 B/s)
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "zh_CN:zh",
LC_ALL = (unset),
LANG = "us_EN"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
Selecting previously deselected package libapache2-mod-bw.
(Reading database ... 27546 files and directories currently installed.)
Unpacking libapache2-mod-bw (from .../libapache2-mod-bw_0.91-1_i386.deb) ...
Setting up libapache2-mod-bw (0.91-1) ...
Reloading web server config: apache2.
重启服务器
/etc/init.d/apache2 restart
#限制全局的速度www.blogguy.cn原创,转载请注明来源www.blogguy.cn
<IfModule mod_bw.c>
BandWidthModule On //开关
# ForceBandWidthModule On //默认就是开启的,表示捕获所有请求,如果要过滤部分请求,则需要手工指定过滤器
#FORCEBANDWIDTHMODULE OFF
#ADD OUTPUTFILTERBYTYPE BW-MOD TEXT/HTML TEXT/PLAIN
BandWidth all 81920 //所有ip来源限制到80k的速度
#MinBandWidth all 5120
</IfModule>
具体的设置跟虚拟主机的设置,就不用多说了,根据你自己的需要调整,没有一了百了的办法,你的应用类型是最关键的。
如果你没有必要限制用户的连接数,强烈建议你不要限制。
最后说说怎么修改下面这个错误信息
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.2.16 (Debian) Server at www.blogguy.cn Port 80
在连接数已经满了的情况下,会出现Service Temporarily Unavailable错误 难看,能不能弄成自己定义的文件的呢?
当然可以,跟404的错误自定义是一样的,不过这个错误是503
在全局文件或者虚拟主机配置文件上添加
#ErrorDocument 503 "连接数已满" 这是直接显示文件
#ErrorDocument 503 "/missing.html" 显示文件
做过404跳转的朋友肯定知道了,不用多说了。
转载请注明来源www.blogguy.cn
原文地址:http://www.blogguy.cn/show-803-1.html