在说apache的keepalive之前,我们需要对web数据的加载过程有些简单的了解
这里先介绍一个测试网站加载工具:Pingdom Tools ,在这个工具中,我们输入一个网址来测试下加载速度,同时最重要的是观察加载过程:
其中每块的含义是:黄色是http的启动时间,绿色是http请求的链接时间,蓝色是加载时间;
从这个结果图中,我们可以看到:
1)所有的请求,这里指的是http请求,都是分为三步走的,第一步启动,第二步链接,第三步正式下载
2)所有的网页,首先启动首页的http请求,链接请求,并且下载主页上部的数据,下载这部分数据是只能有一个http请求下载
3)当主页中上部分数据下载完成之后,会下载遇到的css js文件(注:这个工具不统计js),在以后的数据下载中,会并发10个http请求同时下载
4)在下载当前10个http请求数据的时候,其他资源需要等待,所以,在优化的过程中,我们要注意web资源的数量
5)下载某个web资源时候,如果该资源比较大,当然需要很长时间加载了,所以还要注意大小。在以上测试中,没有涉及到请求下载资源过程中还有一个部分:TCP请求的链接与断开,而这篇文章正式说这个请求的。那么http请求和tcp请求是什么关系呢?简单点说就是一个tcp请求是比较靠近底层的,在它上面是http之类的应用请求,所以可以认为一个tcp请求包括很多个http请求(至于包括多少,apache中可以设定),同时tcp的链接与断开比http请求的链接和断开更需要消耗掉更多的内存资源和时间。先来说说Apache的KeepAlive的设置。
- KeepAlive在Apache Core中的设置说明:
对于HTTP/1.0的客户端来说,仅当客户端指定使用的时候才会使用持久链接连接。此外,仅当能够预先知道传输的内容长度时,才会与HTTP/1.0的客户端建立持久链接连接。这意味着那些长度不定的内容,诸如CGI输出、SSI页面、以及服务器端生成的目录列表等内容一般来说将无法使用与HTTP/1.0客户端建立的持久链接连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用分块编码以解决在持久里链接发送未知长度内容的问题。
- 另一个相关的是KeepAliveTimeout在Apache Core中的设置说明:
- MaxKeepAliveRequests在Core中的说明:
对于我的哪个朋友,他们的服务器中有着动态应用,有着所有的图片,我看了一下,估算他们的首页中发出的请求类型为以下几种:text/html、text/css、application/octet-stream、text/javascript、image/gif、image/jpeg。一个首页发出了181次请求(我看了所有的请求,注意所有的请求都是同一个域名)。这里可能由应用程序生成的只有text/html和application/octet-stream,这种请求中text/html只有一次,而application/octet-stream也只有4次。哪么关闭KeepAlive对他们有帮助吗?我的回复是没有帮助,而且会让服务器的服务质量更差!如果是这样的情况,怎么办呢?
我的建议如下:
1.如果我们每一个页面中只有一个请求是动态生成的,而180个(里面可能有4个不是,不过不重要了)都是静态的,哪么应该将静态与动态分开到两个服务器上(一台机器都可以)。将动态应用的KeepLive关闭,将静态服务器的KeepLive打开。
2.前端前部署四层交换或七层交换或缓存服务器,这样会让系统的扩展做起来,同时也可以让服务器的KeepLive打开时有更好的效果。
3.应该考虑优化下他们的apache了,听说一个进程有高达xxM的内存占用,比较恐怖,在10M以内比较正常的说,不过这是一个option了。
如何验证你的服务器apache是否开启了该功能(你要是买的是虚拟空间,一般网管不会给你开启的,因为消耗太多内存)?站长站工具查询,和gzip压缩一起查询的。
总结:长连接既有优点也有缺点,一方面长连接的话会造成内存消耗过大,另一方面apache的此种长连接对于动态请求和静态请求的效果不同,对于动态请求不好,一个请求就占用一段tcp,对于静态内容,可以同时下载多个http请求,是有好处的,所以猜想:把web分为个服务器,一个服务器存放静态的html css js 尤其图片,一个服务器存放动态的页面请求,按照理论上来说,效果会更好,但是具体实际效果以及测试数据我现在并没有测试。