- 前言
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第 1 篇 高性能网站构建
- 第 1 章 深入理解 DNS 原理与部署 BIND
- 第 2 章 全面解析 CDN 技术与实战
- 第 3 章 负载均衡和高可用技术
- 第 4 章 配置及调优 LVS
- 第 5 章 使用 HAProxy 实现 4 层和 7 层代理
- 第 6 章 实践 Nginx 的反向代理和负载均衡
- 第 7 章 部署商业负载均衡设备 NetScaler
- 第 8 章 配置高性能网站
- 第 9 章 优化 MySQL 数据库
- 第 2 篇 服务器安全和监控
- 第 10 章 构建企业级虚拟专用网络
- 第 11 章 实施 Linux 系统安全策略与入侵检测
- 第 12 章 实践 Zabbix 自定义模板技术
- 第 13 章 服务器硬件监控
- 第 3 篇 网络分析技术
- 第 14 章 使用 tcpdump 与 Wireshark 解决疑难问题
- 第 15 章 分析与解决运营商劫持问题
- 第 16 章 深度实践 iptables
- 第 4 篇 运维自动化和游戏运维
- 第 17 章 使用 Kickstart 完成批量系统安装
- 第 18 章 利用 Perl 编程实施高效运维
- 第 19 章 精通 Ansible 实现运维自动化
- 第 20 章 掌握端游运维的技术要点
- 第 21 章 精通手游运维的架构体系
最佳实践 11:优化缓存防盗链
盗链是指本网站的资源被非授权的第三方网站直接在页面中进行引用。对于被盗链的网站来说,盗链现象既浪费了大量的带宽又失去了对于版权文件的控制,因此需要在缓存节点上对 URL 进行校验,设置防盗链。防盗链的几个基本方法如下。
- 使用 HTTP Referer。HTTP Referer 是 HTTP 请求的一个头部,用于标明被请求的资源是在哪个页面中进行调用的。对静态图片资源文件,使用 HTTP Referer 设置防盗链即可。
- 使用生成动态链接的方法。这个方法的本质是首先在页面上产生资源 URL 的时候,使用动态编程语言,生成类似如下结构 http://music1.woyo.com/music1-abcdefghijk.mp3?key=xxxxyyyyzzzzaaaadddd 。在缓存节点上收到用户的请求时,对该 URL 的 key 进行验证。该方法一般用于视频、音频等比较大的文件的防盗链检查。
Key 的组成
其中 key=20080722101000A-MD5-KEY 表示一个加密串。加密串包括以下两个部分。
- 20080722101000:表示时间戳,即年月日时分秒。
- A-MD5-KEY:一个 MD5 串,其计算方式如下为 A-MD5-KEY=md5(base_url+datetime+password)。其中,base_url 即请求中的 http://music1.woyo.com/music1-abcdefghijk.mp3 ;datetime 为请求中的时间戳 20080722101000;password 是源站和 CDN 约定的一个密码。
校验过程
具体的校验过程如下:
1)检查防盗链的串(即 key)是否存在,如果不存在,则返回校验失败。
2)从防盗链串中取出日期时间,与当前时间比较,如果超出有效期范围(例如,如果与当前时间相减,大于±2 小时),则返回校验失败。
3)生成 MD5 的值,与请求中的 A-MD5-KEY 相比较,如果不等,则返回校验失败。
4)如果上述步骤都通过,则返回校验成功。
5)如果校验成功,则 CDN 缓存服务器向用户返回正常的响应。
6)如果校验失败,则向把请求重定向到广告音频。
实施过程
在 Squid 配置文件中/usr/local/squid/etc/squid.conf 增加如下配置:
redirect_program /usr/local/squid/etc/checkkey.pl redirect_children 20
重定向器
安装 Perl 的 MD5 模块:
cd /root wget http://www.kamnet.cn/srv/Digest-MD5-2.36.tar.gz wget http://www.kamnet.cn/srv/Digest-Perl-MD5-1.8.tar.gz tar xvfz Digest-MD5-2.36.tar.gz cd Digest-MD5-2.36 perl Makefile.PL make make install cd .. tar xvfz Digest-Perl-MD5-1.8.tar.gz cd Digest-Perl-MD5-1.8 perl Makefile.PL make make install
源码(checkkey.pl):
#!/usr/bin/perl -wl use Digest::Perl::MD5 'md5_hex'; use POSIX qw(strftime); $|=1; my $password = 'IblessWoyo'; my $errurl = 'http://err.woyo.com/woyo.mp3'; my $result = 'http://err.woyo.com/woyo.wma'; while (<>) { ($uri,$client,$ident,$method) = ( ); ($uri,$client,$ident,$method) = split; #解析 Squid 传入的参数 my $time_from = strftime "%Y%m%d%H%M%S", localtime(time - 1*3600); my $time_to = strftime "%Y%m%d%H%M%S", localtime(time + 1*3600); next unless ($uri =~m/^http:\/\/(.+?)\/(.*)\?key=([0-9]{14})(.+)$/); if (($4 eq md5_hex("/".$2.$3.$password)) && ($3 > $time_from) && ($3 < $time_to)) { #检查 md5 和 URL 中包含的时间 $result = "http:\/\/$1:81\/$2"; } else { $result = $errurl; } } continue { print $result; #通知 Squid 防盗链检查结果 }
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论