一.防盗链设置
在nginx 的wiki站了解到一个第三方模块ngx_http_accesskey_module,通过自己测试,能有效的防盗链,特别是对于文件下载站的防盗链非常有效。
有关这个模块的一些文档在这里去看:http:///NginxHttpAccessKeyModule
1. 下载NginxHttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz;
2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。
编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”
3. 用一下参数重新编译nginx:
shell> ./configure --add-module=path/to/nginx-accesskey4. 修改nginx的conf文件,添加以下几行:
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构成的字符串。
访问测试脚本download.php:
<?php
$ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
$output_add_key="<a href=http://xx/download/xx.rar?key=".$ipkey.">download_add_key</a><br />";
$output_org_url="<a href=http://xx/download/xx.rar>download_org_path</a><br />";
echo $output_add_key;
echo $output_org_url;
?>
原理是:
通过接受到的参数值判断访问是否合法。这里有一套MD5加密算法。前台的网页根据用户的IP产生一个MD5值,后端的WEB SERVER就来判断这个MD5,对的就放行。不对就拒绝。浏览器上直接访问物理文件,是不能打开的。
如我的download 目录下有一个 file.zip 的文件。对应的URI 是http://xx/download/file.zip
使用ngx_http_accesskey_module 模块后http://xx/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载download目录下的file.zip。而且 key 值是根据用户的IP有关的,这样就可以避免被盗链了。
二. nginx的线程限制和带宽限制
这里有nginx的标准模块ngx_http_limit_zone_module,
这个模块可以针对条件,进行会话的并发连接数控制。
http {
limit_zone one $binary_remote_addr 10m; #定义one
server {
location /download/ {
limit_conn one 1; #一个ip客户端,最大2个并发线程
limit_rate
32k; #每个线程最大下载速度
}
if ($request_method !~* ^(GET)$ ) { #只允许get方式请求,其他访问方式403
return 403;
}
}
}