在本身页面上显示一些不是本身服务器的资源
(图片、音频、视频、css、js等)因为别人盗链你的资源会加剧你的服务器负担,因此咱们须要防止
可能会影响统计javascript
防止别人经过一些技术手段绕过本站的资源展现页,盗用本站资源,让绕开本站资源展现页面的资源连接失效
大大减轻服务器压力php
一、Referer (易伪造referer,安全性低) 二、加密签名 (安全性高)
经过Referer,服务器能够检测到访问目标资源的来源网站,若是是资源文件,则能够跟踪到显示它的网页地址。一旦检测到来源网站不是本站进行阻止
css
经过签名,根据计算签名的方式,判断请求是否合法,若是合法则显示,不然返回错误信息
html
以Nginx为例,前提加载
ngx_http_referer_module模块
前端
//指令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; } }
注意:为何要none呢?由于若是经过浏览器直接访问资源,referer就是为空,因此这种方式不能完全阻挡住盗链。java
以Nginx为例,前提加载第三方模块
HttpAccessKeyModule
实现防盗链web
location ~* \.(gif|jpg|png|webp)$ { accesskey on; accesskey_hashmethod md5; accesskey_arg key; accesskey_signature "mysrc$remote_addr"; }
80~90%是花费在页面引用控件的加载上,只有10~20%是花费在文档的加载上
HTTP/1.1协议规定请求只能串行发送,换句话就是100个请求,只能一个一个发送,上一个请求完成才能进行下一个请求redis
减小引用控件数量,从而达到减小HTTP请求次数sql
一、图片地图
数据库
原理
:把多张图片合成一张,再使用<map>标签来实现对图片上不一样区域的连接
<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>
二、CSS Sprites(雪碧图)
原理
:合拼图片,再使用css的background-image和background-position来指定显示元素
CSS Sprites与图片地图性能差很少,但CSS Sprites更加简单灵活
三、合并JS与CSS文件
加载一个JS文件比加载多个JS文件要快
通常会使用前端自动构建工具打包合并
四、图片使用base64编码
注意:图片base64除了可使用在<img>中,还可使用在css的background-image中
CDN 就是
内容分发网络
,在各处放置服务器
来构成一层智能虚拟网络,此处服务器称之为节点服务器。所谓智能就是会自动根据用户请求信息把请求从新分配到离客户端最近的服务器。
CDN的做用: 解决因为服务端与客户端所在区域的不一样,致使影响数据传输速度和稳定性问题,一句话总结就是
让数据传输更快更稳定
。
一、
智能Cache加速
,提升企业站点的访问速度(含大量图片或静态页面最适合,由于CDN至关因而服务器的一个镜像)
二、跨运营商的网络加速
,保证不一样网络的用户都能获得很好的访问速度
三、加速用户远程访问服务器
,根据DNS负载均衡技术自动智能选择Catch服务器
四、自动生成远程服务器的镜像(Catch服务器)
,加速访问速度,减轻Web服务器的负担,分担流量
一、网站或应用中大量静态资源的加速分发
(例如:css/js/图片等)二、大文件下载
三、直播网站
高并发下只能经过提升服务器负载来解决?
NO,流量、前端、服务器、数据库
缓存只能是数据库缓存吗?NO,还有浏览器缓存
1.
200 OK (from memory cache)
直接从本地缓存中获取响应,最快速、最省流量,由于没有向服务器发送请求
2.
304 Not Modified
协商缓存,浏览器在本地没有命中的状况下,请求头中会发送必定的校验数据到服务器。若是服务端数据没有改变,服务端直接响应(通知浏览器从本地缓存获取),返回304(快速、发送数据不多,只返回最基本的响应头,不发送响应体)
PS: 以上两种缓存所有失败,服务器返回完整响应体(
200 OK
),没有用到缓存,速度最慢
浏览器本地缓存
相关的header
Pragma
Cache-Control
Expires
让资源文件更小,加快文件在网络中传输,让网页更快的展现,下降流量和宽带开销
JS、CSS、HTML、图片压缩和Gzip压缩
去除一些多余的空格和回车,替换长变量名,简化一些代码写法 压缩工具:在线版和安装版
与JS压缩原理同样,去除空白符、注释和优化一下语义化
(不推荐,镇用)
不推荐使用,由于会破坏代码结构。
压缩工具:tinypng/JpegMini/ImageOptim
Gzip压缩
是Web服务器对纯文本文件(JS/CSS/XML/HTML)
进行压缩注意:千万不要对图片进行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;
将现代动态语言的逻辑代码生成为静态HTML文件(静态化实际做用:缓存成一个html文件),再次访问时就会重定向到静态文件
对实时性要求不高的页面
解决高并发,减轻Web服务器和数据库服务器压力
一、使用Smarty模板引擎
二、使用ob系列函数
//缓存存放目录 $smarty->cache_dir=$ROOT.'/cache'; //开启缓存 $smarty->caching=true; //缓存过时时间 $smarty->cache_lifetime=3600; //加载模板 $smarty->display(); //清除全部缓存文件 $smarty->clearAllCache(); //清除特定模板的缓存 $smarty->clearCache('index.tpl');
//开启输出缓冲区 ob_start(); //获取输出缓冲区内容 ob_get_contents(); //清空(擦掉)输出缓冲区 ob_clean(); //送出输出缓冲区内容并关闭缓冲 ob_end_flush(); //获得当前缓冲区的内容并删除输出缓冲区 ob_get_clean();
进程
:是一个“执行中的程序”,程序不执行就不会产生进程。一个执行中的程序至少会产生一个进程,当进程得到了处理机时才会从就绪状态变为运行状态,处理机不断切换地分配到每一个进程中。决定同时有多少个进程处于运行状态的是处理器数量(CPU核数)
进程的三态模型:多个程序在系统中运行时,进程在处理机中交替运行,状态在不断切换。 三态分别是:就绪、运行、阻塞
进程的五态模型(在三态的基础上发展而来):新建态、运行态、终止态、就绪态、等待态
线程
:称之为轻量级的进程
,程序执行流的最小单元。线程依赖于进程(一个进程能够有多个线程),线程不拥有系统资源。与同属一个进程的其余线程共享进程拥有的所有资源
;一个线程能够建立和撤销另外一个线程,同一个进程中的多个线程能够并发执行
。一个进程下有多个线程来完成不一样的工做称之为多线程。(一个进程下至少会有一个线程)
线程由来:因为用户并发请求,为每一个请求都建立一个进程显然太浪费系统资源和影响响应用户请求的效率,因此引进线程的概念。
协程
:是一种用户态轻量级
的线程。
//协程与线程的区别 一、协程是由用户本身调度,而线程是用系统调度 二、协程是异步的,而进程线程是同步的 三、一个线程能够有多个协程,一个进程也能够单独拥有多个协程 四、协程会保留上一次调用的状态
多进程:2个或2个以上的进程处于运行状态,进程间通讯不方便
多线程:把一个进程分为不少片,每一片都是一个独立的流程,线程间能够互相通信
1.使用
swoole扩展
2.使用
消息队列
3.接口的并发请求
curl_multi_init()
传统关系型数据库都是把数据存储到硬盘中,在高并发状况下,对数据库服务器会形成巨大压力(巨大IO操做),为了解决此问题,数据缓存由此而生!
做用:
一、极大地缓解
数据库服务器的压力
二、提升数据的响应速度
缓存形式有:内存缓存、文件缓存
推荐使用内存缓存
第一次访问:
再次访问:
一、
七层负载均衡(Nginx)
二、四层负载均衡(LVS/硬件设备)
基于URL等应用层信息
实现负载均衡
// 通常使用Nginx来实现 功能强大、性能卓越、运行稳定 配置简单灵活 上传文件使用异步模式 多种分发策略 自动剔除不正常工做设备
内置
加权轮询、IP Hash
外置
fair策略、通用Hash、一致性Hash
http{ upstream cluster{ server srv1; server srv2; server srv3; } server{ listen 80; location / { proxy_pass http://cluster; } } }
有2种方式实现:
一、LVS
二、硬件设备
LVS负载均衡的三种方式:NAT、DR和TUN 硬件设备:经过报文中的目标地址和端口,再加上负载均衡设备的服务器选择方式,决定最终选择的内部服务器
字段数据类型优化
tinyint/smallint/int/bigint的选择 char/varchar enum 固定分类 IP地址数据如何存? 答案:把IP地址转整型类型存储
索引
SQL语句优化
存储引擎优化
表结构设计优化
数据库服务器架构优化