防盗链处理
1 简单的通过referer判断
location ~ .*\.(gif|jpg|jpeg|png|bmp|wma|mp3|swf)$ { valid_referers none blocked server_names *.163.com 163.com baidu.com; if ($invalid_referer) {return 403;} expires 30d; }
2 NginxHttpAccessKeyModule 插件
这个需要安装额外的模块,下载模块源码,然后按照说明文档,将下载来的源码中”$HTTP_ACCESSKEY_MODULE” 替换成 “ngx_http_accesskey_module“,再
-
./configure –add-module=path/to/nginx-accesskey
完了以后再重新编译一次nginx,然后就可以在配置文件中使了。
location /download { accesskey on; accesskey_hashmethod md5; accesskey_arg "key"; accesskey_signature "mypass$remote_addr"; }
这样一个下载的文件就需要 http://example.com/download/file.zip?key=09093abeac094 这样的形式进行下载
其中 key的值为 mypass和下载客户端ip 进行md5运算获得。比如在 php 中可以向如下方式输出针对客户ip的下载链接地址
-
<?
-
$ipkeyvalue = md5(“mypass”.$_SERVER[‘REMOTE_ADDR’]);
-
$out_keyfile_link=”<a href=http://example.com/download/testfile.rar?key=”.$ipkeyvalue.”>防盗链文件下载</a><br />”;
-
echo $out_keyfile_link;
-
?>
这样当一个用户将访问地址拷贝给别人时,因为访问ip不同,就造成 md5(“mypass”.ipaddr) 值不同,达到防盗链目的。
限速处理
限速使用 limit_zone, limit_conn 以及 limit_rate 进行配置
首先在 http 段配置一个 limit_zone,然后在需要的地方使用 limit_conn 和 limit_rate 进行限速设置,如下一个简单的例子
http { limit_zone one $binary_remote_addr 10m; server { location /files/ { limit_conn one 1; limit_rate 20k; } } }
说明:
limit_zone,是针对每个IP定义一个存储session状态的容器。这个示例中定义了一个名叫one的10m大小的容器,这个名字会在后面的limit_conn中使用。
limit_conn one 1;
限制在one中记录状态的每个IP只能发起一个并发连接。
limit_rate 20k;
对每个连接限速20k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许三个并发连接,那么这个IP就是限速为limit_rate×3,在设置的时候要根据自己的需要做设置调整,要不然会达不到自己希望的目的。