如果让你限制迅雷的种子下载你会吗?不开车,纯技术分享
引言
迅雷下载一直都是大家喜欢用的下载工具软件,但是往往它有一个小问题,你知道吗?
不要想歪啦!!
假如你的服务器带宽和硬件资源不是很够,那么直接放空让用户直接通过迅雷下载网站资源,这样下去,你的服务器资源肯定会拖垮的。最终的结局就是你访问你的网站,想看个小视频或者小电影呀,最终的结果就是 页面500
为啥迅雷下载过多,会有这个问题呢?
这得从迅雷的机制来谈起,首先迅雷它得用户分很多,同时用户下载资源,又不会考虑咱家服务器的好不好,有没有劲儿啊 。那都是一顿操作猛如虎的,批量下载开始凑数。
可能一个客户端,任务就是几十上百个。那迅雷为满足用户的要求,就基于 多线程 的机制来跑任务。这样成倍数 (客户端数*多线程数的任务) 的客户端下载,是你,你顶的主吗?
打个比方: 现在下载一部电影,大小为1GB。假如服务带宽为5MB。 你的下行网速为100KB/S。这样10个下载任务,估算为1M。
那现在10个客户端,20个任务整起来,那就需要20M才可以满足,你的5M网速的机器满足得了别人吗? 而且我们这里也还没考虑上行网速,工作时服务器资源的开销。难道别人做了事儿,你不给钱吗? 那就是白嫖
这里当然是给大家举例,一般大型公司的网卡都是千兆和万兆网卡的
所以面对过多的任务客户端下载,咱们还有有必要进行拦截的,不然就是牵一发而动全身。
那如何对迅雷进行下载呢?
画面迎面走来一个好看的小姐姐,你都不认识她,你能怎么限制呢? 既然要适当的限制下载请求,那首先肯定需要先识别到迅雷这个东西,然后可以根据单位时间里面。你下载的次数进行安排。
例如:你1s超过10次。就开始进行不让你进行下载文件,这样就可以满足到我们的要求
怎么识别迅雷呢?
这个就得说说迅雷的下载机制,其实它本质也是发送一个HTTP请求到你的服务端,一般发送一个请求头就会有一个 HTTP_USER_AGENT 来标识这个客户端,如果咱们一旦发现了它 ,就立马把它拿捏住。死都不放开。
比如:浏览器访问一个网站也携带 HTTP_USER_AGENT 头,迅雷下载的时候,服务端照样会接受到这样的客户端得头。如下是浏览器访问的标识头
一般像Apache就会内置这个变量,直接调用这个变量做判断,而对应判断的值,你可以提前的打开日志等级为 alert 。这样每次迅雷访问就可以记录下来,拿到值后 就是开干。 作为颜值的代表,给大家放到下面了。
注意:它是Apache里面日志的设置方式,一共有9个等级,开的越多,记录的信息就月详细,线上不要看的太低,不然文件可能会撑爆。
LogLevel alert rewrite:trace8
设置后,每次访问就有这个头,你仔细看!!!
那限制的规则呢?
在你下载目录下面,添加一个.htaccess文件,里面写上下面的规则内容。
# 开启Apache的重写引擎
RewriteEngine on
#拿到HTTP请求发送客户HTTP_USER_AGENT和迅雷的标识做对比,只钥满足我就让这个请求重定向
#到winner.txt,不让它下载需要的资源啦。 当然也可以直接return 返回 503 都是阔以得
# NC代表大小写不敏感,OR是或的条件判断
RewriteCond %{HTTP_USER_AGENT} 67.0.3396.99 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC]
RewriteRule . winner.txt
从而做到让原来准备下载一个文件资料的额,结果就按照重定向的规则去下载到其它的内容里面去。 这样就是拦截迅雷的请求,或者还在家拒绝掉它 。
那怎么做到次数的限制,这里就得下载一个扩展 mod_limitipconn 。然后在里面编写限制流量访问的IP
ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.so
<IfModule mod_limitipconn.c>
<Location /> #对应根目录
MaxConnPerIP 6 #最大并发数