xiaoyi's blog
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

xuexuguang

后端新秀
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 学习

  • GitHub技巧

  • 面试

    • 面试问题集锦
    • PHP基础
    • 正则表达式
    • PHP文件操作
    • PHP会话控制
    • 自定义函数及内置函数
    • MVC对比
    • linux
    • MySQL数据库基础
    • MySQL创建高性能的索引
    • MySQL的SQL优化
    • MySQL的高可扩展和高可用
    • MySQL安全
    • 常见算法
    • 常见数据结构
    • 高并发解决方案
    • 流量优化
      • web资源防盗链
        • 什么是防盗链?
        • 防盗链的工作原理
        • 实现方式
      • 减少HTTP请求的次数
        • 为什么要减少HTTP请求?
        • 减少HTTP请求的方式
    • 浏览器缓存和数据压缩
    • 图片优化
    • 静态化处理
    • 动态语言并发处理
    • 数据库缓存优化
    • 负载均衡
  • 博客搭建

  • 心情杂货

  • 技术文档

  • 实用技巧

  • 友情链接
  • 更多
  • 面试
xuexuguang
2020-12-31

流量优化

# 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

# 加密防盗链的处理

如果客户端刻意伪造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

配置好签名之后,我们访问图片的时候拿着签名进行认证就可以获取到正常的图片了

$sign = md5('mypass'+$_SERVER['REMOTE_ADDR'])
echo "<img src = "./logo.png?sign={$sign}">"
1
2

# 减少HTTP请求的次数

# 为什么要减少HTTP请求?

性能黄金法则:只有10%-20%的最终用户响应时间花在了下载HTML文档上。其余的80%-90%时间花在了下载页面中的所有组件上。因此,改善响应时间最简单的途径就是减少HTTP请求的数量。

# 减少HTTP请求的方式

HTTP链接产生的开销:

  1. 域名解析
  2. TCP连接
  3. 发送请求
  4. 等待
  5. 下载资源
  6. 解析时间

常用的解决方式

  1. 图片地图
  2. css脚本精灵
  3. 合并多个脚本为一个脚本
  4. 使用Base64编码嵌入图片
编辑
#高并发面试题
上次更新: 2020/12/31, 06:55:18
高并发解决方案
浏览器缓存和数据压缩

← 高并发解决方案 浏览器缓存和数据压缩→

最近更新
01
MVC对比
12-31
02
负载均衡
12-31
03
数据库缓存优化
12-31
更多文章>
Theme by Vdoing | Copyright © 2020-2020 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式