Nginx防盗链模块HttpAccessKeyModule配置与研究
看过群里的下载站就想自己也来研究下,没想到自己整起来这么的曲折,让我没有想到的是原来nginx维基上也会有不全的地方,配置这个模块是很简单,要真的使用还这么的麻烦.好了废话不多看教程吧.
系统:centos 5.6
需要的软件:nginx-1.0.9.tar.gz Nginx-accesskey-2.0.3.tar.gz
1.确认安装了gcc和make,如果没有就运行下面的命令
yum -y install gcc* make
2.解压nginx和nginx-accesskey,并编译nginx
tar zxf Nginx-accesskey-2.0.3.tar.gz && cd nginx-accesskey
修改conf文件里内容,如下图:
也就是把这行HTTP_MODULES="$HTTP_MODULES $HTTP_ACCESSKEY_MODULE"替换为HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"
tar zxf nginx-1.0.9.tar.gz && cd nginx-1.0.9
编译如下:
./configure --user=nginx --group=nginx --add-module=../nginx-accesskey-2.0.3 --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-http_secure_link_module --with-http_random_index_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_perl_module --with-http_geoip_module --with-mail --with-mail_ssl_module --with-cc-opt='-O3' --with-cpu-opt=opteron
具体参数解释可以看我的用tcmalloc优化nginx 这篇文章 .
然后执行:
make &&make install
service nginx restart
3.修改nginx配置文件
vi /etc/nginx/nginx.conf
nginx文件里内容:
/download替换为你想要防盗链的目录.
重启nginx后,访问https://blog.slogra.com/download会出现403错误提示.所以我们要用php来配合下载.
代码如下:
<!--? $ipkey=md5("mypass".$_SERVER['REMOTE_ADDR']); $output_add_key="<a href=https://blog.slogra.com/download/xxx.rar?key=" .$ipkey."-->download_add_key";
$output_org_url="<a href="https://blog.slogra.com/download/xxx.rar">download_org_path</a>";
echo $output_add_key;
echo $output_org_url;
?>
当然我是根据朋友兔子的php代码来做的下载,这个代码我放在附件里提供给大家下载.
4.nginx-accesskeyp使用cookie做key
一般我们使用防盗链都是使用这样的配置:
location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}
对大部分的网站来说,一般程序和下载文件不会是在同一台服务器的,所以对于多出口的网络(如移动,铁通,或一个公司有多个出口做负载均衡的情况下),就可能出现key对不上而发生403的问题,对于这个问题,只能选择换key了,不用$remote_addr那用什么呢?Cookie是个好尝试,于是上面的配置可以改成:
if ( $http_cookie ~* " ng_cookie=(.+?)(?:;|$)")
{
set $ng_cookie $1;
}
location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$ng_cookie";
}
测试过ie,firefox,获取cookie都OK,只要不清cookie,不跨域,对于同一个浏览器来说url都不会失效.
5.nginx-accesskey和proxy store结合试用
第三方模块跟nginx自带的模块总会发生一些冲突而导致某些功能失灵,当access key和proxy store同时使用的时候就会发生冲突而导致加密失败,但nginx总能用一些nginx特殊的方式去解决这个问题,比如可以通过404去请求proxy store,配置如下:
proxy_buffering on;
location / {
root /home;
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypasswd$remote_addr";
error_page 404 =200 /fetch$request_uri;
}
location /fetch/ {
alias /home;
proxy_store on;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_pass http://10.0.0.2;
}
用户请求到/,先通过access key判断是否有效,无效直接403,有效继续往下走,假如碰到404,就跳到/fetch/,从后端的服务器把文件抓过来.
好了,大家可以根据上面的一些配置来自己进行研究.
附件下载:
index.rar 5.13KB
评论: