使用Apache打造完美限制的HTTP下载服务器
一开始本来准备选择使用ftp作为下载服务器的,不过过了几天就发现很多都是通过盗链的方式来ftp下载。这下服务器在持续性全速提供上传,但是网站的页面浏览量却少得可怜。因为ftp天生不能放盗链的特性所以只能考虑放弃使用,最后决定用http下载来替代。
直接用http服务器下载也不是很容易的事。最开始在iis里面配置,iis只能设定最大下载速度和最大连接数,这对于一些使用下载工具一来就开50+线程霸道下载的朋友明显是防不住的。网上搜了n久就发现一个用delphi写的看不懂的isapi filter以及别的收费软件若干。试过之后都起不了作用,也便放弃了,最后发现apache有这些开源的功能模块,最终打造出完美限制的http下载服务器。
首先说说完美限制的意思:防盗链、限制客户端下载线程数,限制下载带宽。下面一一介绍怎么在apache里面实现这些功能。
防盗链
传统的防盗链都是通过referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造referer了。
现在一些流行的防盗链的方式都是用在浏览页面的时候产生一个随机验证码,在用户点击连接的时候服务器会验证这个验证码是否有效从而决定是否允许下载。或者就是用某些方法把文件实际地址进行伪装。不过我觉得这些都不怎么好用,我用了一个简单有效的方式来实现防盗链。
其实就是用cookie,配合apache的url rewrite模块很简单的就能实现防盗链下载。
首先在浏览页面的时候,会向客户端发送一个特别的cookie,例如“site=3grjz.com“,盗链而来的将没有这个cookie。
在apache的httpd.conf文件里面搜索:
#loadmodule rewrite_module modules/mod_rewrite.so
把它前面的#去掉,再找到<directory />块,在里面加入类似如下代码:
<directory />
# other configurations …
rewriteengine on # 启动url rewrite引擎
rewritecond %{http_cookie} !^.*(?:site=3grjz.com).*$ # 对于cookie里面没有特殊记录的请求进行重定向
rewriterule ^.*$ error.html # 将非法访问重定向到错误页面
</directory>
这样如果一个盗链而来的请求将会因为没有特殊cookie而被重定向到错误页面,就算实际地址暴露也不怕。至于这个cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说下载工具也没法伪造,从而防止了服务器资源被盗链的危险。
限制客户端多线程下载操作流程
限制多线程现在需要用到一个apache的扩展模块mod_limitipconn,这里是作者的官方网站[url]http://dominia.org/djao/limitipconn2.html[/url],先下载适合自己版本的模块文件到apache安装目录下的modules目录下面,然后在httpd.conf文件中搜索:
#loadmodule status_module modules/mod_status.so
把它前面的#去掉,再加入:
extendedstatus on
loadmodule limitipconn_module modules/mod_limitipconn.dll
# 如果你下载的不是win版,请把后面的文件名改为你所下载的文件名
<ifmodule mod_limitipconn.c>
<location /> # 这里表示限制根目录,即全部限制,可以根据需要修改
maxconnperip 2 # 这里表示最多同时两个线程
nolimit html/* # 这里表示html目录下不受限制
</location>
</ifmodule>
这样来自同一客户端的超过2个的线程请求将被拒绝,从而限制了客户端的多线程下载。
限制下载带宽操作流程
这个同样需要扩展模块支持,模块是mod_bw,在作者的官方网站[url]http://ivn.cl/apache/[/url]可以下载到。同样也是放入modules目录下面,然后在httpd.conf文件中加入:
loadmodule bw_module modules/mod_bw.dll
再找到<directory />块,加入:
<directory />
# other configurations …
bandwidthmodule on # 启动带宽限制
forcebandwidthmodule on # 启动带宽限制
maxconnection all 2000 # 最大连接数2000
bandwidth all 200000 # 单个客户端最大带宽200kb
</directory>
这样限制了同时最多2000个连接数,每个客户端最大200kb的下载带宽。
到此,我们的完美限制的http下载服务器就配置完成了,重新启动你的apache这些功能便能生效了。因为apache和这些模块都是开源免费的,我们不需要为此掏一分钱,不用去购买那些第三方的软件,只是需要多去了解一下这些软件的使用说明。不要一切都祈祷有现成美好的东西,自己动手做一次会有不一样的收获。
上一篇: python socket