web资源防盗链
- 盗链是什么? 为什么要防?
- 防盗链是什么? 有哪几种方式?
1、Referer (易伪造referer,安全性低)
2、加密签名 (安全性高)
- 防盗链的工作原理
- Referer实现
//指令valid_referers 全局invalid_referer
location ~* \.(gif|jpg|png|webp)$ {
valid_referers none blocked domain.com *.domain.com ;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.domain.com/403.jpg;
}
}
- 加密签名
location ~* \.(gif|jpg|png|webp)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg key;
accesskey_signature "mysrc$remote_addr";
}
减少HTTP请求次数
- 发现问题
- 如何改善?
- 如何实现减少请求?
1、图片地图
<img src="img/planets.gif" width="145" height="126" alt="Planets" usemap="#planetmap">
<map name="planetmap">
<area shape="rect" coords="0,0,82,126" alt="Sun" href="sun.htm">
<area shape="circle" coords="90,58,3" alt="Mercury" href="mercur.htm">
<area shape="circle" coords="124,58,8" alt="Venus" href="venus.htm">
</map>
2、CSS Sprites(雪碧图)
CSS Sprites与图片地图性能差不多,但CSS Sprites更加简单灵活
3、合并JS与CSS文件
一般会使用前端自动构建工具打包合并
4、图片使用base64编码
CDN加速
- 什么是CDN加速?
- CDN有什么优势?
- CDN的工作原理是什么?
- CDN适用场景有哪些?
- CDN如何实现?
浏览器缓存
- HTTP缓存分类(2种)
- 与
浏览器本地缓存
相关的header
前端代码和资源压缩优化
- 压缩方式
- JS代码压缩
去除一些多余的空格和回车,替换长变量名,简化一些代码写法
压缩工具:在线版和安装版
- CSS代码压缩
与JS压缩原理一样,去除空白符、注释和优化一下语义化
- HTML代码压缩
(不推荐,镇用)
不推荐使用,因为会破坏代码结构。
- 图片(JPG、PNG)压缩
- Gzip压缩
//以Nginx为例
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明,推荐6
gzip_comp_level 6;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
# 压缩存储的缓冲
gzip_buffers 16 64k;
# 开启压缩的http版本
gzip_http_version 1.1;
动态语言静态化
- 适用场景
- 为什么要使用静态化?
- 静态化实现方式有几种?
- 使用Smarty模板引擎
//缓存存放目录
$smarty->cache_dir=$ROOT.'/cache';
//开启缓存
$smarty->caching=true;
//缓存过期时间
$smarty->cache_lifetime=3600;
//加载模板
$smarty->display();
//清除所有缓存文件
$smarty->clearAllCache();
//清除特定模板的缓存
$smarty->clearCache('index.tpl');
- 使用ob系列函数(重点,实现静态化基础)
//开启输出缓冲区
ob_start();
//获取输出缓冲区内容
ob_get_contents();
//清空(擦掉)输出缓冲区
ob_clean();
//送出输出缓冲区内容并关闭缓冲
ob_end_flush();
//得到当前缓冲区的内容并删除输出缓冲区
ob_get_clean();
动态语言的并发处理
- 什么是进程?什么是线程?什么是协程?
进程的三态模型:多个程序在系统中运行时,进程在处理机中交替运行,状态在不断切换。
三态分别是:就绪、运行、阻塞
进程的五态模型(在三态的基础上发展而来):新建态、运行态、终止态、就绪态、等待态
线程由来:由于用户并发请求,为每个请求都创建一个进程显然太浪费系统资源和影响响应用户请求的效率,所以引进线程的概念。
//协程与线程的区别
1、协程是由用户自己调度,而线程是用系统调度
2、协程是异步的,而进程线程是同步的
3、一个线程可以有多个协程,一个进程也可以单独拥有多个协程
4、协程会保留上一次调用的状态
- 什么是多线程?什么是多进程?
- 同步阻塞模型
- 异步非阻塞模型
- PHP并发编程实战
curl_multi_init()
数据缓存
- 什么是数据缓存?
传统关系型数据库都是把数据存储到硬盘中,在高并发情况下,对数据库服务器会造成巨大压力(巨大IO操作),为了解决此问题,数据缓存由此而生!
- 为什么要使用数据缓存?(答案如上)
- 如何使用Mysql查询缓存?
- 如何使用Memcache缓存?
- 如何使用redis缓存?
Web服务器负载均衡
- 实现方式
- 七层负载均衡
// 一般使用Nginx来实现
功能强大、性能卓越、运行稳定
配置简单灵活
上传文件使用异步模式
多种分发策略
自动剔除不正常工作设备
- Nginx负载均衡策略
加权轮询、IP Hash
fair策略、通用Hash、一致性Hash
- Nginx配置负载均衡
http{
upstream cluster{
server srv1;
server srv2;
server srv3;
}
server{
listen 80;
location / {
proxy_pass http://cluster;
}
}
}
- 四层负载均衡
LVS负载均衡的三种方式:NAT、DR和TUN
硬件设备:通过报文中的目标地址和端口,再加上负载均衡设备的服务器选择方式,决定最终选择的内部服务器
MySQL数据库优化
- 优化方向
tinyint/smallint/int/bigint的选择
char/varchar
enum 固定分类
IP地址数据如何存?
答案:把IP地址转整型类型存储
- 列表项目