优化网站性能
1.为什么需要优化网站
1.1 大型网站的特点:
> 高访问量
> 同时在线人数多
> 数据量庞大
> 数据操作频繁
1.2 网站性能监测指标:
> 日访问量[1万人,涉及购买带宽]
> 同时在线人数[500-800人,可能影响买服务器设备配置]
> 常用页面最大并发连接数[最低为60--100]
> 访问响应时间[服务器生成html时间、网络传输时间、浏览器解析时间,和带宽、网页内容、服务器性能都有关系]
> 关于最大并发连接数:
当打开或者刷新某个网页的时候,网内内容在请求、图片、css、js都在想服务器发出请求,服务器将处理来自用户的许多并发请求数,如果多人操作,请求数量将很庞大。一般来说并发数都是大于当前在线人数的。
1.3 网站性能的集体体现:
首屏时间:一个网站对浏览器上部800x600区域充满所需要的时间。 网页访问可用性:用户访问网站的成功率
网页访问可用性
建立连接时间:
DNS时间
重定向时间:
第一个数据包时间:
总下载时间:网页的总耗时
错误情况:死链接、网站崩溃
2.网站性能优化
雅虎的黄金法则[7个方面34条黄金法则]
内容
服务器
Cookie
CSS
JavaScript
图片
移动应用
2.1 使用YSLow插件分析网站性能
核心的优化方法:
2.2 网页内容优化:
>减少HTTP请求次数,通过减少页面中的元素减少请求次数
有没有减少HTTP请求又保持页面内容丰富的技术呢?
.合并文件(js或者css)
.CSSSprites图片拼合(常用)
.图片地图(不常用)
>减少DNS查找次数
减少主机名数量可以减少dns查找次数
>避免跳转
>可缓存的Ajax
>减少DOM元素的数量
>避免使用iframe
>避免404错误
2.3 图片优化
>使用工具优化图片
检查你的gif图片,如果只有4中颜色,但是打开看见的颜色板是256中颜色,那么说明还有压缩空间
尝试把gif格式转换为png格式节省空间
在所有png图片上运行png优化工具
在所有jpeg图片上运行jpg优化工具
把所有的图片是用同意的jpg、gif或者png格式,进行适当的转化,可以达到很好的优化效果,不推荐是用bmp格式图片,把上传的图片进行格式转换可以达到很好的压缩效果
>使用合理的图片尺寸
不要依赖html中的代码来控制显示图片的大小而是用比实际需要大许多的图片,例如不要将500x500像素的图片缩小成100x100像素的图片是用
>网站图标favicon.ico要小而且可缓存
favicon.ico是位于服务器根目录下的一个图片文件,它是必定存在的,因为即使你不关心它是否有用,浏览器也会对它发生请求,因为最好不要出现404错误
>使用CSSSprites优化页面小图片
在Sprites中尽量水平排列图片文件,垂直排列会稍稍增加大小
在Sprites中把颜色相近的组合在一起,可以降低颜色数,理想状况是低于256色,以便于使用png8的格式
不要再sprites的图像中间留有较大的空隙
2.4 CSS和JavaScript优化
>把样式表置于顶部
把样式表置于顶部Head标签内部会加快网页下载速度。
推荐在开发阶段按照w3c标砖将样式和html分离,在发布阶段将样式和html合并,从而有效改变样式表加载效率问题。参考网站淘宝、新浪
>用<link>代替@import
<linktype="text/css" rel="stylesheet"href="style.css"/>
<styletype="text/css">
@import url(style.css);
</style>
>避免使用滤镜
.png{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='hi.png');}
滤镜在加载图片时会终止内容呈现,并且冻结浏览器,每个元素运算依次增加了内存开支
结论:避免使用滤镜,使用PNG格式的图片来代替,主流浏览器一般都支持这种格式,必要时使用CSSHack来处理IE6浏览器下的效果。
>精简CSS和JavaScript
使用工具JSMin、YUICompressor
>把JavaScript放在HTML底部
<scriptlanguage="javascript" src="5js"></script>
</body>
</html>
脚本带来的问题是阻止了页面的平行下载,HTTP1.1规范建议浏览器的每个主机名的并行下载内容不超过两个
如果图片放在多个主机名上,你可以在每个并行下载中同时下载两个以上文件,但是当下载脚本的时候浏览器就不会通知下载其他文件了,即便是主机名不相同。
2.5Cookie优化
>缩小Cookie大小
去除不必要的Cookie
设置合理的过期时间
>避免使用全局域名的Cookie
对静态内容的请求应该是无Cookie的请求,应该对图片等页面元素使用没有Cookie的域名
2.6 服务器端优化
>使用内容分发网络(CDN)
>为文件头指定Expires或Cache-Control
静态内容设置Expires
httpResponse.setHeader("Expires","neverExpire");
or
<metahttp-equiv="Expres" content="neverExpire">
动态内容设置Cache-Control
httpResponse.setHeader("Cache-Control","no-cache");
结论:对于静态内容,设置文件头过期时间Expires的值为"Neverexpire"(永不过期)
>使用Gzip压缩文件内容
在很多情况gzip大概可以减少70%的响应规模
从http1.1开始,Web客户端都支持http请求头中有Accpet-Encoding的格式,如果Web服务器从请求头中检测到了这段代码:Accpet-Encoding:gzip,deflate,就会以客户端列出的方式来压缩响应内容,Web服务器把压缩方式通脱响应文件头当中的Content-Encoding:gzip来返回给浏览器
结论:开启应用服务器端的Gzip压缩设置
如何开启tomcat的gzip压缩???
> 打开conf目录下的server.xml文件找到一下位置:
<!--Note : To use gzip compression you could set the following properties :
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml"
-->
>将这段代码拷贝到以下配置节里面即可:
<Connectorport="8080" maxHttpHeaderSize="8192"
maxThreads="150"minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"redirectPort="8443" acceptCount="100"
connectionTimeout="20000"disableUploadTimeout="true" />
>使用GET来完成AJAX请求
XmlHttpRequest发送Post请求的过程是两个过程,首先发送文件头,然后发送数据,因此使用GET最为恰当,因为它只需要发送一个TCP数据包,IE中的URL的最大长度为2K,因此发送超过2K的数据时就不能用GET了.
3.网站静态化
从开发的角度来讨论网站性能优化
动态页面的弊端[服务器压力大、页面响应时间长、安全问题],目前国内很多网站采用了网站静态来解决问题。
实施静态化的原因:
提高访问速度
减轻服务器压力
加强安全性
利于搜索引起收录
如何静态化网站??
绝大多数网站采用模板化技术来实现网站静态化
3.1 网站静态化的好处
>效率方面
纯静态化HTML页面[没有任何需要服务器解释的页面,效率高消耗资源小,打开速度优于动态页面]
减轻服务器的压力
不需要服务器进行脚本解释,直接返回静态内容给浏览器
利于搜索引擎收录
动态页面对搜索引擎并不有好
把动态网站进行url重写,使其静态化是一个非常重要的技巧
提高服务器的性能
动态页面访问数据库是最耗时的阶段。
>安全方面
防止SQL注入
网站出错时,不影响网站正常访问
静态页面只是在生成静态页面的时候访问数据库,之后就不会访问数据库了。
3.2 网站静态化的实现方式
模板技术
Velocity
>对于ASP.NET、PHP、JSP等各类动态网站,静态化的技术一般都是采用模板技术
>对于Java动态页面,一般采用Velocity、FreeMarker等模板框架来实现
>模板技术的原理
4.数据库查询优化
为什么需要优化数据库查询
大部分页面通过velocity模板技术已经被静态化了,极大减少了网站负担,但是某些页面(例如更新比较频繁的页面、查询页面)是不能静态化的,仍许查询数据库。
>常用的SQL查询优化法则
在查询频繁的列上添加合适的索引
索引作为数据库中的重要数据结构,其根本目的就是提高查询的效率,优化查询的重要方法就是建立索引,建立适合关系型数据库的索引,这样就可以避免表扫描,减少了页面查询引起的输入输出开销,有效地提高了数据库的查询速度,优化数据库的性能,但是创建索引的同时也增加了系统时间和空间上的开销,所以创建索引时应该与实际的查询相结合,这样才能真正的优化查询。
判断并建立必要的索引
对索引使用一些规则
合理的索引对sql语句的意义
尽量少用IN或NOTIN
在where子句中尽量少用IN或NOT IN,可使用Exist或not exist代替in 或not in
尽量少用*
selecttop 50 name,age,address from table1
尽量少用LIKE
使用like在查询完成的时候变量的值不确定,索引无法使用索引,建立的索引也就失去了意义
5.性能检测
性能环境发生改变
网站的性能随着浏览量和硬件发生改变的,网站运行之前和正式运行期间有必要对网站的整体性能进行检测
使用软件监控网站的性能
网站的性能检测分为两个阶段来完成
网站的开发期间
使用LoadRunner等专业的负载测试工具
通过模拟上千万用户并发负载及实时性能检测的方式来确认和查找问题
使用LoadRunner能够最大限度的缩短测试时间优化性能和加速应用系统的发布周期
LoadRunner的强大之处:
轻松创建虚拟用户
创建真实的负载
定位性能问题
分析结果以精确定位问题所在
重复测试保证系统发布的高性能
网站的运营期间
网站运营期间的检测
常用的检测工具:国内的监控宝、美国的ServiceUptime、Uptime robot、Site24x7