高性能网站架构方案(二)——优化网站响应时间

高性能网站架构方案(二)——优化网站响应时间

(原创内容,转载请注明来源,谢谢)

一、概述

优化网站响应时间是保证网站受用户关注的要点,主要方案有:

1、减少HTTP请求

当需要加载图片、css、js等内容时,尽量减少加载的次数。可以合并加载,另外当改动量很少时,尽量将内容进行缓存。

图片的缓存可以设定更新时间,定时去服务器查看是否有需要更新的内容。通常可以定时在1周甚至更久的时间。

CSS、JS的缓存,通常可以通过文件名的方式来判断是否需要重新加载。当网页确定需要加载某些js和css时,把文件和已经缓存的文件名进行判断,文件名一致则直接用缓存。因此,可以在文件名中设定版本号,如初始阶段是avatar.1.js,当对此js的内容进行改动后,将html上加载的js文件名改为avatar.2.js,相应的改变服务器上的文件名,强制进行加载。另外,对于可以网页加载完毕后再加载的js,可以将引用的代码放到html标签的最后,保证先将页面展示出来。

2、动态内容静态化

3、优化数据库

数据库的优化是网站优化的最关键的部分。后面专门写。

4、使用负载均衡

可以用DNS轮询、反向代理、HTTP重定向等方式,实现负载均衡,保证每台web服务器接收的请求数量大致相同。

5、使用缓存

使用缓存将改动量大、读取量大等的内容保存在内存中,避免数据库的多次操作,由于内存的读写速度比I/O的速度快得多(数据库存在硬盘中,读写需要经过I/O),则可以节省较多的时间。

二、吞吐率与压力测试

吞吐率是指单位时间内服务器处理的请求数,通常用reqs/s。吞吐率描述运行期间单位时间内处理的请求数,当需要衡量单位时间内可以承受的最大吞吐率,则需要压力测试。

压力测试有许多工具,如LoadRunner、JMeter、ab(Apache Bench)等。

ab是apache附带的压力测试软件。可以通过linux的命令行,直接进行测试,使用方法如下:

ab[options] [http://]hostname[:port]/path

其中,options是可选参数,主要如下:

1)-n:测试会话中执行的请求数,默认是1个

2)-c:要创建的并发用户数,默认1个

3)-t:等待web服务器的最大响应时间,默认没有限制

4)-k:使用keep-alive特性

5)-C:(大写的C)对请求附加一个Cookie,形式为name=value

实例,10个并发用户、1000次请求:

ab -c 10 -n 1000 http://localhost/index.php

其结果会有执行总次数(-n参数)、并发请求数(-c参数)、成功次数、失败次数、总耗时、平均每个请求的耗时(即用户平均等待时间)、平均每秒可以处理的请求数(即吞吐率)。其中,吞吐率是平均每秒处理的请求数,在结果中的参数是Request per second。

三、持久连接

持久连接(Keep-Alive)又称为长连接,是指TCP连接中持续发送多份数据而不断开连接。相应的也有短连接的概念,即每次完成数据发送后就断开连接。

由于客户端和服务器每次建立连接,都需要进行三次握手,需要耗费时间。因此希望进行长连接,改变数据发送后就断开的情况。HTTP1.1开始支持长连接。

HTTP长连接需要浏览器和Web服务器共同完成:浏览器需要保持一个TCP连接不断开,并且不断发送多个请求;服务器不能过早主动关闭连接。

目前大部分浏览器支持长连接,只需要在发出的HTTP请求数据头中包含相关长连接的声明即可:Connection:Keep-Alive,即在发出的header中定义该连接方式即可。

对于服务器,则需要Web服务器的配置中支持长连接,如:

Apache中设置:KeepAliveOn,KeepAliveTimeout 20

Nginx中配置:

http {
keepalive_timeout20; --长连接timeout
    keepalive_requests 8192; --每个连接最大请求数
}

长连接对于浏览器和服务器都有默认超时时间,即超过设定的时间如果还没有请求,则断开连接。当双方都设定超时时间,则以较短的一方为最终的超时时间。

当大量请求小文件时,长连接可以显著加快速度。但是,长连接会影响到服务器的并发性能,因此也不是所有情况都设置长连接。

——written by linhxx 2017.08.16

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

df,du,磁盘分区

df命令 df命令是用来报告磁盘文件系统的使用量 #df -h           @根据磁盘的大小适当的用适当的单位去表示 Kb,Mb,Gb,Tb #df -...

3007
来自专栏张善友的专栏

Web API核查表:设计、测试、发布API时需思考的43件事

当设计、测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统。那么至少,你也要建立在HTTP上,而HTTP则是基于TCP/IP创建的、TC...

1596
来自专栏PHP技术

CI一些优秀实践

最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路。用在公众的项目,最好还是按框架...

3165
来自专栏编程

Spring-Data-REST轻松搞定RESTfulAPI

背景 昨天同事问我有没有研究过 ,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 ,过一会发过两个截图过来。真的很强大,感觉这个在使用...

2246
来自专栏IT技术精选文摘

从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。

924
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件

系列回顾       WinForm篇我用了一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实例一个模块(商品字典)和一步一...

1719
来自专栏烂笔头

Django中六个常用的自定义装饰器

1014
来自专栏林德熙的博客

C# AddRange 添加位置

有没人想知道, AddRange 添加位置 是哪? 是添加到数组的开始,还是数组的末尾?

451
来自专栏PHP技术

WordPress的可拓展性初探(二)

作者:西瓜玩偶(racnil070512 at hotmail dot com) 上一篇文章介绍了如何设计数据库,从而达到可拓展性的目的。下面的篇幅将介绍在P...

32812
来自专栏Thinks

Service Worker最佳实践

Service Worker是一项比较新的Web技术,是Chromium团队在吸收了ChromePackaged App的Event Page机制,同时吸取了H...

2411

扫描关注云+社区