背景
昨天实践了python结合nginx下的secure_link实现防盗链,今天也继续把第三方模块实现的方式实践一下。
安装模块nginx-accesskey
模块地址:https://github.com/olcms2016/nginx-accesskey
步骤:
1:首先下载模块
[root@bogon bak]# git clone https://github.com/olcms2016/nginx-accesskey
2:编译模块
ps:为了保留上一个自带的模块,编译的时候也需要继续加上上一次已经安装的模块
--add-module=/data/bak/nginx-accesskey --with-http_secure_link_module
[root@bogon bak]# cd nginx-1.10.3
[root@bogon nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --add-module=/data/bak/nginx-accesskey --with-http_secure_link_module
3:make 生成二进制文件
4:查看已经安装模块信息:
[root@bogon nginx-1.10.3]# nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --add-module=/data/bak/nginx-accesskey --with-http_secure_link_module
[root@bogon nginx-1.10.3]#
结合python web 实践:
1:结合昨天的示例,新增一个路径请求,并反向代理到新的python web服务去
相关的配置:
1:静态页面的web配置web.conf
server {
listen 80;
server_name 192.168.74.128;
root /data/app/html/;
location / {
index Index.html index.html;
#proxy_pass http://192.168.182.155:8089;
}
location ~* ^/(upload)/{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.74.128:8089;
#alias /data/app/html2/static/$1; //文件可以放到别的目录
#error_page 404 =200 @backend; // 如果访问出现404转发到后台服务器
}
}
1:静态页面的index.html
protect
protect
2:python web 代理配置文件web_app.com(因为python web使用到了相关uwsgi启动相关服务,所以这些需要配置一下使用nginx进行访问uwsgi启动的python web)
server {
listen 8089;
server_name 192.168.74.128;
root /data/app/xianzhi/;
location / {
#新增模块的防盗链的位置
accesskey on; #模块开关
accesskey_hashmethod md5; #加密方式MD5或者SHA-1
accesskey_arg "key"; #url中的关键字参数
#accesskey_signature "mypass$remote_addr"; #加密值,此处为mypass和访问IP构成的字符串
accesskey_signature "mypass$uri"; #加密值,此处为mypass和访问路径构成的字符串
include uwsgi_params;
uwsgi_param UWSGI_PYHOME /data/app/xianzhi;
uwsgi_param UWSGI_CHDIR /data/app/xianzhi;
uwsgi_param UWSGI_SCRIPT app; # 对应main.py
uwsgi_pass 127.0.0.1:8086;
client_max_body_size 50m;
proxy_connect_timeout 1; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 120; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 120; #连接成功后,后端服务器响应时间(代理接收超时)
}
}
3:然后使用python代码生成对应的 secure_link_md5信息,用于在nginx进行相关鉴权处理
生成相关URL地址示例:
生成代相关认证签名的地址: http://192.168.74.128/upload/1.mp4?key=d289481ba0a53fa5d0cc8d42d7c1d68d
测试1:
访问: http://192.168.74.128/upload/1.mp4?key=d289481ba0a53fa5d0cc8d42d7c1d68d
可以正确下载文件
测试2:http://192.168.74.128/upload/1.mp4 返回403
测试3:修改key参数也返回了 403
注意事项PS:
部分的请求,如果直接不经过nginx访问的时候,可以直接进行处理,一个解决的方案就是设置防火墙,在linux中防火墙限制其端口,只能使用nginx进行访问,不能直接访问tomcat
加在自启动中
vim /etc/init.d/rc.local
设置如下
iptables -A INPUT -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8080 -j DROP
–A 参数就看成是添加一条规则
–p 指定是什么协议,我们常用的tcp 协议,当然也有udp,例如53端口的DNS
–dport 就是目标端口,当数据从外部进入服务器为目标端口
–sport 数据从服务器出去,则为数据源端口使用
–j 就是指定是 ACCEPT -接收 或者 DROP 不接收
相关参考:
方法三、使用第三方模块ngx_http_accesskey_module做图片防盗链。
实现方法:
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:
复制代码 代码示例:
./configure --add-module=path/to/nginx-accesskey
- 修改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:
复制代码 代码示例:
$ipkey= md5("mypass".$_server['remote_addr']);
$output_add_key="download_add_key
";
$output_org_url="download_org_path
";
echo $output_add_key;
echo $output_org_url;
?>
访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 forbidden错误