高性能网站使用的14条技术

news/2024/5/13 16:43:07/文章来源:https://blog.csdn.net/allenxiong/article/details/5741741

Translated by mask

从2004年开始,我开始进入雅虎的异常表现小组。我们是一个很小的队伍,专门针对雅虎的产品进行质量检测和改进,我作为一个后端工程师,现在却开始捣鼓前端代码优化方面的工程,所以我认为这是一个极好的进步的机会。我的目标是改进用户端体验,我度量了在各个带宽下浏览器的响应时间,得出如下的一个图表,它展示了来自http://yahoo.com的http的流量。

以上图标的第一个标签就是html,是一个html文档最开始加载的东东,在这个例子中,读取html代码只占了整个响应时间中的5%,这个结果适用于绝大多数网站,在采样美国的前十位网站中,只有一家超过5%但少于20%,其余80%的时间是用来读取网页其他内容的,也就是说,前端(原文是front-end,意思就是不包括html代码的其余内容,可以是图片,脚本,flash,视频,各种东西)。这就是为什么我们要把目光集中在这些东西来提高显示速度的关键原因。

为什么要从前端开始着手有三个主要原因

  1. 这里有提升和改进的潜力。如果能减少一半的体积,就能减少40%的响应时间
  2. 改进前端比改进后端需要的时间和资源更少。(改进后端要重新设计应用程序规划,代码,寻找优化代码的方法,添加或改变硬件配置,分布式数据库,等等)
  3. 前端的改进在我们的工作中已经被证实,我们在yahoo有五十个小组,在我们的最佳表现规则下,提高了他们的用户端响应时间达到25%或更高。

我们的黄金规则是:首先优化前端表现,这些东西耗费了用户端响应时间中的80%。

1.减少http请求数

图片,css,script,flash,等等这些都会增加http请求数,减少这些元素的数量能减少响应时间。

CSS Sprites技术能减少图片的请求数,把零散的小图片放到一起,运用background-position来改变背景图片的位置,前提是html元素事先定义好宽高,其实就像一个遮罩,移动背景就会看到不同的景象。

内嵌图像  用data:URL scheme的方式把图片内容代码直接嵌入html代码中,这样会增大html代码的体积,改进的方式是把内嵌图片嵌入到css中(css被缓存),这样就会更好的减少http请求数而且不增大html的体积。

很多用户都是在空缓存的情况下进入你的网站的,这样第一次的速度就会显得很重要。

第一条规则是最重要的一条规则。

2.运用cdn技术

见: http://hi.baidu.com/axne/blog/item/258e23ade2d76f0a4b36d6d1.html

3.加一个长时间过期的头部

Expires: Thu, 15 Apr 2010 20:00:00 GMT
浏览器会用缓存来减少http请求数来加快页面加载的时间,如果页面头部加一个很长的过期时间,浏览器就会一直缓存页面里的元素。
不过这样会带来一个问题,就是如果页面里的东西变动的话就要改名字了,否则用户端不会主动刷新,在yahoo工作组用的是版本号,例如yahoo_2.0.6.js

4.Gzip压缩

Gzip是现在最流行和最有效的压缩方式,她是GNU开发的,RFC1952标准化。
(Gzip是在服务器端压缩图片,css,脚本等,传送到用户端的浏览器再解压,这样可以提高传输速度,不过对服务器的压力会增大,一般选择部分元素压缩比较合适。)

5.把样式表放到顶部

我们发现把css放到文档头部会让网页加载得更快。因为这样可以让页面逐渐加载。
把样式表放到接近底部的问题是它阻止了页面元素的逐渐显示。这样还会导致“flash of unstyled content” 即在样式表加载之前页面内容是以没有样式的形式显示出来的,待加载完样式后,页面重绘,内容一闪即改变了样式表现。

6.把脚本放到底部

把脚本放到尽可能底部的地方,一个原因是让页面逐渐渲染,另一个是实现更好的并行下载。

对于脚本,脚本以下的内容被阻止逐渐加载了,因为只有当下载完脚本以后才会下载下面的内容,第二个脚本引起的问题是阻止平行下载。 "http/1.1 specification"建议浏览器对一个域名, 同一时间下载数不超过2个(按:实际监测发现一般有超过2个),我曾经让ie并行下载100个图片。 当脚本正在下载的时候,浏览器不会开始下载任何东西。

7.避免css expressions

css expressions 是一个有力(和危险)的方式动态的改变css的属性。他们自ie5就开始被支持,举个例子,用css expression可以让背景色每个小时轮换一次。但是被非ie浏览器忽略的。

background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

expressions的问题就在与它的计算频率绝对超出我们的想象,甚至当我们移动鼠标,都会引起页面的重绘!

下面是举例页面

减少css expressions计算次数的一个方法就是使用一次性的expressions。 当第一次expression计算出一个明确的值,就让样式等于这个值,不再变动。如果样式的属性一定要动态的改变,就用时间句柄吧!

8.让脚本和样式外延

Javascript和CSS应该是外部调用还是内嵌呢?
用外部调用文件的方式更快,因为他们是可以被缓存的,如果是内嵌在页面中他们就无法被缓存了!想想如果用户要在你的网站看很多很多的页面,如果都是使用同一个外部脚本和样式,那么他们一旦被缓存,就再也不需要下载了,这样会给你带来很大的潜在好处。

9.减少DNS查询

10.减小脚本体积

有两个比较流行的工具是用来减小脚本的体积的--JSMin和YUI Compressor
(按:这个压缩和Gzip压缩是不一样的,Gzip是传输压缩,这个是代码压缩)

11.避免重定向

重定向会减慢用户体验,它会延迟所有的东西直至到达新页面。一个最浪费的重定向经常会发生而我们的开发者又会经常忽略的就是比如http://astrology.yahoo.com/astrology的结果是重定向到http://astrology.yahoo.com/astrology/ 在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。

从一个旧网站跳转到新网站也是经常要用到重定向,还有就是连接一个网站中的不同部分和在某些情况下(比如不同浏览器,不同的用户帐号类型,等等)的用户导向。用重定向很简单,而且只需要一点额外的代码,虽然在这些情况下用重定向减少了开发者的复杂度,但它降低了用户的体验,变通的做法是用Alias和mod_rewrite如果两个部分是在同一主机上的话,如果是由域名变更引起的重定向,变通的做法是通过Alias或mod_rewrite创建一个CNAME(一个DNS记录,创建一个别名,从一个域名指向另一个域名)

 

12.去掉重复的脚本

(按:简单的说,同一个脚本如果被调用多次,浏览器并不会忽略后续的脚本,而总是覆盖加载,覆盖运行,这样会增加开销)

13.配置ETags

ETags(Entity tags)是服务器和浏览器的一个功能,它用来判断浏览器缓存里的元素是否和原来服务器上的一致。ETags比last-modified date更具有弹性,它用一个独一无二的字符串来标识一个元素的版本。
源服务器用响应头里的ETag来特定一个元素的ETag:
       HTTP/1.1 200 OK
       Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
       ETag: "10c24bc-4ab-457e1c1f"
       Content-Length: 12195
之后,如果浏览器要验证这个元素,它就会用If-None-Match头来回传ETag到源服务器。如果符合的话,一个304状态的代码就会从源服务器返回到浏览器,这样源服务器就节省了传输具体数据的开销。
       GET /i/yahoo.gif HTTP/1.1
       Host: us.yimg.com
       If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
       If-None-Match: "10c24bc-4ab-457e1c1f"
       HTTP/1.1 304 Not Modified

用Etags的问题就在于它会标识那个特定的服务器,如果换了服务器,Etags也就失去了原有的功能,但是这种现在在网络上太常见了,因为我们经常用服务器集群。默认情况下,Apache和IIS会在Etag中内嵌数据,这样会动态减少验证成功的机会。

Apache1.3和2.x的ETag格式是inode-size-timestamp。虽然一个文件可能在不同服务器的同一个目录,同样的大小,安全级,时间戳等等,它的inode会随着服务器的不同而不同。

IIS5.0和6.0有同样类似Etags的东西,叫时间戳:ChangeNumber(更改号),更改号是一个用来追踪IIS配置变化的计数器,ChangeNumber在不同IIS服务器之间是不一样的。

它最终的问题就是,IIS和Apache产生的Etags会在不同服务器之间无法匹配,这样我们的浏览器就无法得到我们期待的304响应,而给我们的是一个普通的200响应,和正常的数据流。如果你的网站只有一个服务器还无所谓,如果是集群,而你用的是默认的ETag配置,你的用户就会获得更慢的页面,你的服务器也会有更高的负载,消耗更大的带宽资源,代理也无法高效缓存你的内容,甚至即使你有一个长时间过期的头部(按:见第三条规则),也不会阻止它重新载入内容。

如果你不想发挥Etags提供的这个弹性验证模型的优势,你最好关掉它。Apache中关掉它的方法是在Apache的配置文件中写这么一句:
FileETag none

14.让Ajax缓存

人们会问这些规则同样适用于web2.0吗?当然!这个规则是我在雅虎工作做web2.0后得出的第一条规则。

Ajax的一个好处是它会给你实时的回馈,因为它和后台的服务器是异步传输的,然而,用Ajax并不能保证你的用户不用无聊的拨弄手指头来等待这个回馈,在很多应用中,用户是否需要等待取决于Ajax是怎么用的,举例说,在一个基于网页的邮件客户端,用户会持续等待Ajax的回馈来搜索符合他的标准的邮件信息。记住“异步”并不意味着“实时”。让它缓存的方式同样是加一个过期头部。

按:
粗略的译了一下,并非逐字的翻译,就是让大家有所了解了,翻译不好的地方请见谅!
上面那个图大家可以在firebug(firefox下运行)的net选项卡中获得服务器的响应数据!
基于以上规则,yahoo出了一个延伸firebug插件的插件。在这里下载:
http://developer.yahoo.com/yslow/

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

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

相关文章

成就大型高性能网站的十项规则

在我们公司ChinaNetCloud,见过多种不同类型的网站和系统,有好也有差。其中有些系统拥有良好的服务器/网络架构,并且进行了合理的调整和监控;然而一般的系统都会有安全和性能上的问题,不能良好运行,也无法变得更流行。 …

怎么让网站快速生成手机App?

初雪云 如果你一个手机站,想给网站加个壳,封装成一个APP。打开显示的还是网站,就是多了启动页面,可以的话能在加上加载页面,标签导航栏,可以实现吗?我的回答是肯定的,现在APP的开发成…

电商分析:网站运营不得不做的用户分析

当电子商务网站成功地把一个访客转化成一个客户之后,如何提高这个客户对于网站的忠诚度,继而增加客户对于网站的整体贡献值就变得非常重要了, 因为带来一个新客户的成本是维护好一个老客户的3 ~5 倍 。只有有效地提高每个客户的消…

anaconda git/镜像网站下载压缩包后本地安装

**情景:有时候会从git或者非官方下载第三方库,无法从pip里查找 ** 1、从镜像网站(https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/)或者其他情况下载下压缩包,不要解压(格式为zip/.tar.g…

爬山虎采集实战-站长之家网站排行榜

目标采集网址:中文网站总排名_网站排行榜 类型:标准列表页详情页翻页 数据量:1895页 x 30/页 56850条数据 采集工具:爬山虎采集器 爬山虎采集器 - 简单易用的网页数据采集工具_免费网页爬虫软件 首先我们建立一个任务&#xff0…

利用阿里云对象存储(OSS)提升小网站的访问速度

相信有不少同行都喜欢做一个自己的小网站。毕竟CSDN的广告确实很恶心。(是不是要封我的号了,哈哈~~~) 对于一些穷学生,没错就是本人。一般买的服务器的都不太贵,所以性能确实不太强。例如我的1核2G1M带宽的 腾讯云服务…

博客网站的安全运维尝试

树莓派 最近博客经常时不时的被人攻击,有时候对网站影响不大,有的时候对网站影响很大,会导致网站持续性的CPU过高。 如果网站或者服务器因为漏洞被攻击、被黑导致了异常的话,一般服务器肯定会存在一些日志或者读写文件的操作。我…

惊!一个千万级 PV 规模高性能高并发网站架构

作者:一盏烛光,贤牛特邀工程师。 成为【贤牛】工程师,按需运维,灵活用工,让运维工程师多赚一些零花钱,多一些企业级运维经验。 客户端:缓存(expires)、deflate 压缩 缓存…

wap网站首页宽度和长度统计分析

1、手机wap网页显示基本数据 2、手机以下特征影响页面宽度: Wap页面在手机的显示宽度由手机决定: 大屏手机是240和320两种宽度,目前各网站在宽度显示问题的处理上,有固定页面宽度(如空中网、搜狐网等)和自…

手机网站重构经验分享(S60V3篇)

前言 做WEB重构的同学都应该知道,我们一般需要在一个操作系统 (Windows XP)和4种以上的浏览器(IE678,Firefox,Chrome,Opera等)上测试页面的兼容性。 相对而言,手机上的页面兼容性测试,相当痛苦!手机光操作系统都有S60V3,S60V5,MTK,Android,Windows Mobile等等,每个操作系统上除…

教程:利用Cloudflare网关搭建访问IPFS网站

最近,笔者的微信朋友圈被“Cloudflare网关”刷屏了,到底是怎么回事呢? 原来在9月17日这天,IPFS项目团队Protocol Labs发布了一条推特,为美国互联网安全提供商Cloudflare的一款新产品打call。据悉,该产品可…

Axure实战06:创建一个AppleSymbol图标库网站

在本章中,你将学会如何使用Axure中继器和内联框架创建一个AppleSymbol图标库网站。 项目背景 在我们开发iOS应用程序过程,常常会用到图标按钮,Apple提供了一整套官网的图标,开发人员可以直接使用Apple设计的官网图标快速开发App…

网站搭建——环境搭建

前言: 之前做的一个网站是在windows环境下进行开发和部署的,现在想导入到Linux环境下。由于使用的实验室电脑,不方便直接安装Linux系统,所以选择了使用Vmware,然后在安装Linux的做法,安装后Linux后需要安装…

【网页实战】html+css+js超简易书籍购买网站实现(FindMyBook)

代码链接:https://github.com/LimxRabbit/FindMyBook.git 页面截图(功能描述):

奥巴马筹款网站的制作过程

作者: 阮一峰 日期: 2012年12月14日 1. Kyle Rush是一个网站工程师。 2011年6月,他加入BarackObama.com,负责设计2012美国大选的奥巴马官网。 (图为2011年6月的奥巴马官网) 除了宣传,官网的主要…

npskins CSGO开箱 | CSGO皮肤直接取回网页开箱子网站

npskins CSGO开箱 | CSGO皮肤直接取回网页开箱子网站 官方链接: npskins.com 注册登录自动免费获得$0.8美金 推广码: csgogo (注册使用送0.8美金) 支付: 微信 支付宝 状态: 直接取回的开箱网站

使用threading模块创建多线程爬取妹子图网站图集

Python多线程 多线程类似于同时执行多个不同程序,可以让程序的运行速度加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,可以释放一些珍贵的资源如内存占用等等。对于像妹子图这样的图片网站中大量图集的爬取,采…

苹果 CMS 搭建视频网站,定时采集视频

概述 苹果 CMS 搭建视频网站,定时采集视频。 搭建成功的样子:演示地址 环境安装 安装环境:centos7 php7.2 mysql5.6 用到的文件:文件源码 搭建过程 安装宝塔面板(宝塔官网) yum install -y wget &am…

Vue框架的SEO优化之 vue-meta-info prerender-spa-plugin

Vue框架的SEO优化之旅 前言事情起因解决方案方案选择安装插件配置文件开始优化最终结果 前言 SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是&…