Nginx配置防盗链

为什么网站们都要限制流量?

无论是网站服务器亦或是游戏服务器还是邮件服务器,说穿了也是一台电脑,也有CPU和内存。只不过服务器的CPU功能比个人电脑的CPU功能强大,比如个人电脑的CPU一秒钟能算1亿个数,那么服务器的CPU一秒钟就能算十亿个数。毕竟个人电脑只针对个人,但是服务器是要“接客”的,有了强大的硬件做后盾,网页/游戏/邮箱才不会那么轻易的Down掉。

但是CPU不是人类大脑,人脑是越用越聪明,CPU是越用越磨损,毕竟始终在连电的环境下。于是乎,没有必要的运算能省就省,一个人省一次,十万个人就省十万次,一千万个人就省一千万次,这样达到积少成多的目的。

CPU计算的是各种数据,而这些数据也叫作流量。有用的流量、有价值的流量通过CPU计算无可厚非,但是出现了没有用的流量或者是别人盗用我们的资源,那么这种情况能避免都要避免。什么叫盗用我们的资源,比如自己网站(网站A)上的图片或者视频,被其他人直接复制网站然后粘贴到他们的主页(网站B)上,其他用户登录了B网站,然后点击了那个图片和视频,由于是网址重链接,里外里提供数据的还是我们的服务器。也就是说B网站就是一个中介,而真正提供服务的是网站A,但是广告费和点击率都要网站B赚走了,这事儿实在是叔可忍婶不可忍。

什么是盗链?如何发现被盗链?

什么叫盗链,上面已经说的差不多了,如果上面的文字没有看懂的话,举个例子,如果您看到了这两个图片,证明这个网站就是在盗链。
paradin

paradin

这两个就是一个盗取的是QQ空间的图片,另一个就是百度的图片。用其他网站的图片这事儿本身是无所谓的,只要不涉及版权问题,都希望自己的作品能广泛传播,但是请不要直接通过网址重定向,厚道一点的行为应该是:“图片另存为”,然后到目标网站上去重新上传一下。

这里再多说一点网站的基础知识。

  1. PV值:PV=page view,网站是有少则一个网页多则N多网页组成的一个整体,PV值就是统计用户访问网站的总页数。比如www.JQK.com这个网站,今天有100个用户登录,平均每个用户翻阅了里面5个网页。那么这个网站的PV值就是500。若一个IP地址,对一个页面刷新10000次,PV值也是1.要查询网站的PV值登陆http://www.alexa.cn就行。

  2. Hit值:这个就是对网页里每个元素的点击量,一个网页里的图片就是一个元素,一个flv文件也是一个元素,一首歌曲也是一个元素。这些的总量就是hit值,hit值越高就证明这个网站被人查看的情况越高,那么也证明网站的高人气,那么自然广告也会卖出去很多钱。

因为建网站这事儿关心到了金钱利益,网站越被人关注,自然价值也越大。于是会有一个公式来评判网站的“每日贡献”:总流量=访问流量+下载流量= Page view值 x 页面大小+下载文件大小 x 下载次数

作为管理者,每天观察一下自己一亩三分地儿的网站数据情况是本职工作。但是有时候也会遇到网站流量很惊人的情况,一般来说,网站流量过大(CPU运转很多)的原因如下:

  1. 网站是一个很大的网站:比如说淘宝,京东,网易,youtube,facebook那种大网站,里面成万上亿的网页,而且每天又有那么多人登陆,自然浏览量很大。虽然这些大集团的服务器也是少则几千,多则上万,甚至在不同地区也会有不少的服务器集群,但是这几万台服务器需要提供的数据会很多也是不争的事实。这种现象是正常的。

  2. 网页内容太大:可能本身网站是一个小网站,加起来也就十页二十页的内容,但是每一天的流量依旧很惊人,那么很有可能是单页或者某几页的字节太大。比如网页里有太多的图片,太多的视频,太多的其他链接,也有可能是前端码农们给这个网页的规划不合理。导致这个网页每一次被点击都要大费周折(hit值和PV值不高,但是日流量很高),长此以往不仅会耽误用户的整体体验,对服务器也是一个重大伤害。

  3. 搜索引擎产生了大量的数据流量:网站需要推广,于是就在各种搜索引擎上打广告,也有自己网站的很多图片用于外部调用。这样的结果就是本身来观摩网站的人很少,但是“借着引擎经过”的人很多,所以就会有PV值不高,但是Hit值和日流量很高的现象出现。

  4. 图片或者其他元素被盗链:第一部分就说过了,别人拿我们的图片去吸引别人关注,然后别人想要深入了解,还要来使用我们的服务器去提供详细数据。这种“用我们的牌子住我们的房,吃我们的饭却不给我们钱”的现象实在应该被弄死。这种现象的特征也是PV值不高(没人真正点击网站),但是Hit值和日流量很大(自己服务器的数据都给别的网站提供了)。

  5. 网站被DDos攻击了:被一些恶意的IP地址频繁登陆,来回的刷流量。这样迫使CPU做出运算的行为其实就是在远程的破坏服务器的硬件CPU,遇到这种现象,之前Nginx文章里有写,要么通过access.log找到这些IP封掉,要么就在配置文件里加上限制(limit-rate)。

服务器是如何知道图片是从站外而来的呢?

在http协议里有一个重要的选项叫refer,这个选项的内容就是该元素的来源地址。如果这个元素是服务器自己提供的,那么头文件里是没有refer这个选项的。通过refer这个信息,我们也可以知道登陆网站的客户是从哪个网站点击链接而来的。这样方便进行一个统计和规划。

假如,我在QQ空间里面发现一个图,然后右键图片,选择在新标签栏里打开图片,这时候通过浏览器审查元素的功能,能查查看请求头信息和响应头信息,发现响应头信息里多了一个refer,里面的内容就是图片的源地址:
paradin

我在QQ空间里看腾讯的照片自然是可以的,但是如果我在别的网站里看腾讯的照片,加重了腾讯服务器的负担,自然腾讯公司会不满意。于是腾讯服务器发现当前要引用这个图片的地址与refer头信息不是一个来源之后,就不会把这个图片的数据传送过来,于是就看到那个此图片来自QQ空间,未经准许不可饮用的警告图片。

既然知道了服务器是如何判断文件是否盗链,那么只要伪装一个refer就可以欺骗服务器达到“反防盗链”的目的了。至于这部分,可以自己单独研究。

如何使用Nginx反盗链?

同样的使用Nginx.conf,在http的大括号下面,新建一个location,加入如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location
~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
#指定对以上几种类型的文件建立防盗链
valid_referers
none blocked *.alala.com alala.com;
#盗链的范围不包括alala.com和alala.com下的二级网站,
if
($invalid_referer)
{
#rewrite
^/ http://www.alala.com/error.html;
return
403;
#如果发现有引用以上文件的地址与refer头信息不符的情况,直接重定向成error.html这个网页,服务器返回403,forbidden。
}
}

或者使用第三方模块ngx_http_accesskey_module实现Nginx防盗链。实现方法如下:

  1. 下载NginxHttpAccessKeyModule模块文件:http://wiki.nginx.org/File:Nginx-accesskey-2.0.3.tar.gz;
  2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的$HTTP_ACCESSKEY_MODULEngx_http_accesskey_module
  3. 用一下参数重新编译nginx:./configure --add-module=Nginx目录/to/nginx-accesskey,然后执行:make && make install;
  4. 修改nginx.conf文件,添加以下几行:
    1
    2
    3
    4
    5
    6
    location /download {
    accesskey on;
    accesskey_hashmethod md5;
    accesskey_arg "key";
    accesskey_signature "mypass$remote_addr";
    }

其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%