流量优化
# web资源防盗链
# 什么是防盗链?
所谓的盗链就是在自己的页面上展示不是自己网站的一些资源。常见的是小站盗用大站的图片、音乐等资源。那么防盗链就是通过技术手段防止别人绕过本站访问本站的资源,让绕过本站资源的展示页面失效。
# 防盗链的工作原理
通过referer或者签名来检测网站的来源地址,如果是资源文件,则可以显示它的网页地址。如果检测到不是本站则进行阻止。
# 实现方式
# 传统防盗链的处理
Nginx模块ngx_http_referer_module用于阻挡来源非法的域名请求,Nginx指令valid_referers,全局变量$invalid_referer
valid_referers none|blocked|server_names|string; none:'referer'来源头部为空的情况 blocked:'refer'来源头部不为空,但是里面的值被代理或者防火墙删除,这些值不以http或者https开头
# 支持对目录进行防盗处理 location images/
location ~ .*\.(jpg|jpeg|gif|png|js|css)$
{
expires 30d;
access_log /dev/null;
# 如果来源头部为空、来源头部不为空,但是里面的值被代理或者防火墙删除、来源test.server.com均正常显示
valid_referers none blocked test.server.com;
if ($invalid_referer){
return 404;
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 加密防盗链的处理
如果客户端刻意伪造referer,那么传统的防盗链就会失效,可以绕过防盗链。这个时候就需要使用签名的方式进行防范了。这里我们使用第三方HttpAccessKeyModule模块进行签名加密,然后图片访问的时候使用签名进行认证。
nginx的配置如下:
location ~ .*\.(jpg|jpeg|gif|png|js|css)$
{
// accessKey on|off 模块开关
accesskey on;
// accessKey_hashmethod md5|sha-1 签名加密方式
accesskey_hashmethod md5;
// accessKey_arg GET参数名称
accesskey_arg sign;
// accesskey_signature 加密规则
accesskey_signature "mypass$remote_addr" # 使用mypass+客户端ip使用md5加密得到签名
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
配置好签名之后,我们访问图片的时候拿着签名进行认证就可以获取到正常的图片了
$sign = md5('mypass'+$_SERVER['REMOTE_ADDR'])
echo "<img src = "./logo.png?sign={$sign}">"
1
2
2
# 减少HTTP请求的次数
# 为什么要减少HTTP请求?
性能黄金法则:只有10%-20%的最终用户响应时间花在了下载HTML文档上。其余的80%-90%时间花在了下载页面中的所有组件上。因此,改善响应时间最简单的途径就是减少HTTP请求的数量。
# 减少HTTP请求的方式
HTTP链接产生的开销:
- 域名解析
- TCP连接
- 发送请求
- 等待
- 下载资源
- 解析时间
常用的解决方式
- 图片地图
- css脚本精灵
- 合并多个脚本为一个脚本
- 使用Base64编码嵌入图片
上次更新: 2020/12/31, 06:55:18