高性能网站建设指南


进行优化前,关键是剖析当前的web性能,找到性能瓶颈,从而确定最需改进的地方;如果精力有限,首先将精力放在能明显提升性能的改进点上;

《高性能网站建设指南》提出了一个性能黄金法则:

只有10%-20%的最终用户响应时间花在了下载HTML文档上;其余的80%-90%的时间花在了下载页面中的所有组件上。

由于本文将实施一个完整的优化流程,所以,我们还是从后台开始;

案例说明:

优化之前的网站规模:

2个js、一个页头、一个页脚;3个css;

类型:博客类站点;后台逻辑简单;首页不到10个sql查询;

首页html文档52kb;

第一步:后台优化,启用页面缓存;

实验站点首页后台逻辑并不复杂,不超过10个Sql查询,通过查看时间线,本站在获取HTML文档时,花费的时间不到总响应时间的20%,优化之前没有使用缓存,所有的数据都是从数据库读取,这里,我们使用静态页面缓存,将首页整个页面完全的存放在缓存中(关于YII静态页面缓存的使用,参考这里);

通过查看html文档的生成时间来检测优化效果;

首字节时间为376ms;html生成的时间大大缩短,后台时间减少了一倍。

优化前:

WEB站点性能优化实践(加载速度提升2s) 建站教程 第1张

优化后:

WEB站点性能优化实践(加载速度提升2s) 建站教程 第2张

第二步,DNS域名解析加速:

DNS解析是用户访问站点的第一步,在此之前,你的网站无法做任何事情;

站点的DNS解析时间不应该超过500ms,如果站点原始DNS解析时间过长,就该考虑考虑使用第三方解析加速服务;

实验站点的原始DNS解析较慢,平均耗时1017ms,算是非常长的;对于DNS加速,可以使用DNS域名解析加速服务,本站点采用的国内的一款免费DNS加速服务DNSPOD,效果还不错,使用后平均耗时降到370ms;

加速前测试:平均解析时间:1017ms

使用DNS域名解析服务之后的测试:370ms

第三步:使用CDN加速;

采用第三方CDN加速,时间缩短到2.1s;从下图中看到主要的耗时在于并行下载的个数有些低,如果能够提升并行下载量的个数,那么整体加载时间就会降低;

注:个人建议,启用CDN最好放在最后一步,等将站点本身的优化都做完了之后,再启用CDN可以明显的看到优化效果。(开启CDN后,由于有CDN缓存的原因,观测站点的本身的优化就不是很方便了);

WEB站点性能优化实践(加载速度提升2s) 建站教程 第3张


第四步,采用多台服务器提高并行加载量:

原理:一个浏览器对与同一域名的并行下载的个数默认是2个, HTTP.1.0中规定的是4个。这样,我们可以使用不同的域名来提升下载的速度;

观察上图中的下载数量,第一次并行下载的个数是4个,初始认为是浏览器对于同一个域名来源的下载所限导致;于是考虑将部分静态文件分别放在不同的服务器上;通过把css和js放在不同服务器上;结果并不理想,发现并未提高速度。

想到在哪曾看到过,浏览器必须得把放在页头的css和js下载完成了之后才会开始下载其它的静态组件;

关于并行下载这点上,后续将继续实验是否还有优化的空间。

WEB站点性能优化实践(加载速度提升2s) 建站教程 第4张


第五步,合并脚本和样式表;

本站首页使用了2个js和3个css。如果采用朴素复制的方式,将js和css都分别整合到一个文件中,不但操作麻烦,而且不方便后期的管理。网络上有不少合并的工具,本站采用了CSS和JS合并优化工具-minify(下载地址:http://code.google.com/p/minify/)。如果使用的YII框架,更有YII整合版(minscript Extension),简单几步的配置,就自动将页面所有的js和css文件合并;

关于minscript Extension的使用,请参考:https://bitbucket.org/TeamTPG/minscript/wiki/Usage

第六步,压缩css/js/html/xml;

不同的web服务器设置方式有所差别,本站使用的Linux/apache,

在web根目录下的.htaccess文件中添加以下代码即可:

<ifmodule mod_deflate.c>

AddOutputFilter DEFLATE html xml php js css

</ifmodule>

通过firefox工具可看到,压缩前,html文档的大小是25KB;合并后的js大小为138KB;

WEB站点性能优化实践(加载速度提升2s) 建站教程 第5张

压缩后,html文档大小为6.2KB。js大小为39.8KB;减少2/3的传输时间;

WEB站点性能优化实践(加载速度提升2s) 建站教程 第6张

第七步,最大化的减少HTTP请求;

添加Expires头, 启用静态内容缓存,将jpg、gif等文件缓存;

方法也是在.htaccess中添加:

# Image and Flash content Caching for One Month

<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf)$”>

Header set Cache-Control “max-age=2592360″

</FilesMatch>

结论

查看最终的测试结果,整体实现了较大的性能提升,最终页面展现时间为1.62s(测试使用的是一个第三方web测速工具,所有测试结果是在第三方本地无缓存的条件下进行)。仔细观察本站最后几个加载项:有一个第三方网站的广告(加载广告的时刻,页面已经全部呈现,对用户体验影响不大),以及cnzz的统计数据。这样看来,在第12项加载完后,整个页面就完整的呈现在用户面前,优化最终结果是1.1s,较优化前加载速度提升2s;由于物理条件(虚拟机、国外站点)所限,本次优化就到此为止(后续将在并行下载上做做文章,看是否有进一步提升空间)。

WEB站点性能优化实践(加载速度提升2s) 建站教程 第7张

本次优化主要使用的是前端优化,其中大部分规则来自于这本书的指导《高性能网站建设指南》;如果你的web前端部分还没有充分优化,强烈建议读读这本书;

这是一本你只需画上三小时就能看完,但收获价值远远大于付出的一本书。

WEB站点性能优化实践(加载速度提升2s) 建站教程 第8张

附上本书的目录:

绪言A:前端性能的重要性

第1章:规则1——减少HTTP请求

第2章:规则2——使用内容发布网络

第3章:规则3——添加Expires头

第4章:规则4——压缩组件

第5章:规则5——将样式表放在顶部

第6章:规则6——将脚本放在底部

第7章:规则7——避免CSS表达式

第8章:规则8——使用外部JavaScript和CSS

第9章:规则9——减少DNS查找

第10章:规则10——精简JavaScript

第11章:规则11——避免重定向

第12章:规则12——移除重复脚本

第13章:规则13——配置ETag

第14章:规则14——使AjaX可缓存

第15章:析构十大网站

页面大小、响应时间、YSlow等级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js来读写cookie操作

因为之前公司的项目前后端是在一起的&#xff0c;因为要用vue来重构之前的项目。所以token签名要作为一个参数传递到后台。所以就遇到两个问题,1 token的保存和获取的问题。 2 token 判断。判断用户是否用token值。 首先先说一下 token的保存和获取问题。 保存到哪&#xff1…

MUI tab选项卡之间的切换和数据获取

查看mui官网上面的例子&#xff0c;会看到有多种tab 选项卡的例子&#xff0c;我就写下我用到的tab选项卡。写了个简单的例子&#xff0c;效果如下图 主页面的代码 <nav class"mui-bar mui-bar-tab"><a class"mui-tab-item mui-active" href"…

ECharts 联动效果

在使用ECharts 时候要用到联动的&#xff0c;比如下面的示例图&#xff0c;当鼠标经过A的图的时候&#xff0c;这个时候有提示&#xff0c;然后让B的提示也显示出来。这样一个效果。 官方文档给的配置项&#xff0c; http://echarts.baidu.com/api.html#echarts.connect var my…

Git Permission to fazhiyun86/Test.git denied to MarRoar

先说明问题。在我的电脑上有两个SSH key&#xff0c;也就是有两个GitHub账户。我们在GitHub账户里面配置好 SSH key 的时候&#xff0c;就可以向自己的GitHub账户的仓库里面push 代码。 我们先在第一个账户push 代码的时候会让输入 用户名和密码。当向另一个账户push 东西的时…

ECharts 饼图 legend 样式修改

在移动端展示一个数据很多的饼图的时候&#xff0c;首先看一下效果。ECharts legend 配置项 1 legend 让它在右面竖着显示。 legend: {type: scroll,orient: vertical,show: true,right: 0,top: 20,bottom: 20,textStyle: {fontSize: 7},formatter: function (name) {return (n…

ECharts 仪表盘的轴线宽度修改

今天修改仪表盘的轴线宽度&#xff0c; 配置项链接。修改的是下图中线框标注地方的宽度。 下面看一下配置项 option {tooltip : {formatter: "{a} <br/>{b} : {c}%"},toolbox: {feature: {restore: {},saveAsImage: {}}},series: [{name: 业务指标,type: gau…

CSS 让数字滑动显示

最近在做一个数据展示的页面&#xff0c;老板想要的效果是数字滑动的显示。 所以想了一下实现了老板想要的效果。代码如下。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>number</title><…

Status Code:200 OK (from disk cache)和304的区别,以及怎么禁止缓存

有时候缓存是 200 OK (from disk cache)有时候会是 304 ? 看运维是否移除了 Entity Tag。移除了&#xff0c;就总是 200 OK (from cache)。没有移除&#xff0c;就两者交替出现。 他们两个的区别是 200 OK (from disk cache) 是浏览器没有跟服务器确认&#xff0c; 就是它直接…

js 排序

冒泡排序 var dataStore [ 72 , 1 , 68 , 95 , 75 , 54 , 58 , 10 , 35 , 6 , 28 , 45 , 69 , 13 , 88 , 99 , 24 , 28 , 30 , 31 , 78 , 2 , 77 , 82 , 72 ];var t bubbleSort(dataStore);console.log(t);function bubbleSort(data) {var temp 0;for (var i 0; i < dat…

js 类型判断

说到js的类型判断很容易想到的是 typeof、instanceof等。 typeof 有个缺点就是引用类型的结果值都是object 所以就要说一下这些类型是怎么判断的。在说类型判断之前先介绍个东西 Object.prototype.toString 可以查看链接 翻译过来就是 当 toString 方法被调用的时候&#xf…

cordova报错“No installed build tools found. Install the Android build tools version - ”

在cordova 里面添加一个安卓平台后&#xff0c;用android studio打开安装gradle后&#xff0c;然后开始构建项目&#xff0c;这个时候在控制台上会报错 这个时候看到对应的文件下报错信息。 然后我们打开这个文件后&#xff0c; 发现这个 if else 判断走了 else 里面的代码&a…

Vim 常用命令总结

vi 命令编辑器有三种模式&#xff1a;命令模式&#xff0c;编辑模式和末行模式。 命令模式&#xff1a;键盘的任意一个键都可以当成“编辑命令”。 编辑模式&#xff1a;键盘的任意一个键都当成“文本内容”。 末行模式&#xff1a;键盘的任意一个键都当成“文本管理命令”。…

Python数据结构与算法(四)--顺序表

顺序表 在程序中&#xff0c;经常需要将一组&#xff08;通常是同为某个类型的&#xff09;数据元素作为整体管理和使用&#xff0c;需要创建这种元素组&#xff0c;用变量记录它们&#xff0c;传进传出函数等。一组数据中包含的元素个数可能发生变化&#xff08;可以增加或删…

Python数据结构与算法(五)--链表

链表 链表的定义: 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是不像顺序表一样连续存储数据&#xff0c;而是在每一个节点&#xff08;数据存储单元&#xff09;里存放下一个节点的位置信息&#xff08;即地址…

Python数据结构与算法(六)--栈和队列

栈和队列 栈&#xff08;stack&#xff09;&#xff0c;有些地方称为堆栈&#xff0c;是一种容器&#xff0c;可存入数据元素、访问元素、删除元素&#xff0c;它的特点在于只能允许在容器的一端&#xff08;称为栈顶端指标&#xff0c;英语&#xff1a;top&#xff09;进行加…

Python排序算法(一)冒泡排序、选择排序、插入排序

今天总结一下Python中的排序算法。这篇文章有的排序算法是&#xff1a;冒泡排序、选择排序、插入排序。 冒泡排序 先看一下代码。 冒泡排序 def bubble_sort(aList):n len(aList)for i in range(0, n - 1):for j in range(0, n - i - 1):if aList[j] > aList[j 1]:aList…

Python排序算法(二) 快速排序、希尔排序、归并排序

这篇文章有的排序算法是&#xff1a;快速排序、希尔排序、归并排序。 快速排序 快速排序 def quick_sort(aList, first, last):if first > last:returnmin_val aList[first]low_index firsthight_index lastwhile low_index < hight_index:# hight 左移动while low_i…

python二分法查找

常见的搜索方法&#xff1a;顺序查找、二分法查找、二叉树查找、哈希查找。 二分法查找 二分查找又称折半查找&#xff0c;优点是比较次数少&#xff0c;查找速度快&#xff0c;平均性能好&#xff1b;其缺点是要求待查表为有序表&#xff0c;且插入删除困难。因此&#xff0…

【Python学习笔记】Python深拷贝和浅拷贝

Python中copy模块里面常用的两个方法copy.copy() 和copy.deepcopy()也就是浅拷贝和深拷贝 1、copy.deepcopy() 深拷贝&#xff0c;是对于一个对象所有层次的拷贝。 2、copy.copy()浅拷贝&#xff0c;一般来说是对最顶层对象的拷贝。另外浅拷贝对不可变类型&#xff08;如&…

Python装饰器(一)

要学习装饰器&#xff0c;首先要知道闭包的东西。不过这里不再说闭包的东西了。 我们假设一个场景&#xff1a;假如在公司有多个开发部门&#xff0c;A、B....。现在A部门开发出了一个功能&#xff0c;然后其他部门去调用A部门开发的功能。 比如: 如下f1、f2...&#xff0c;是…