Apache的KeepAlive设置与优化

在说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中的设置说明: 
Keep-Alive扩展自HTTP/1.0和HTTP/1.1的持久链接特性。提供了长效的HTTP会话,用以在同一个TCP连接中进行多次请求。 在某些情况下,这样的方式会对包含大量图片的HTML文档造成的延时起到50%的加速作用。在Apache1.2版本以后,您可以设置 KeepAlive On 以启用持久链接。 
对于HTTP/1.0的客户端来说,仅当客户端指定使用的时候才会使用持久链接连接。此外,仅当能够预先知道传输的内容长度时,才会与HTTP/1.0的客户端建立持久链接连接。这意味着那些长度不定的内容,诸如CGI输出、SSI页面、以及服务器端生成的目录列表等内容一般来说将无法使用与HTTP/1.0客户端建立的持久链接连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久将是默认的连接方式。如果客户端进行了请求,将使用分块编码以解决在持久里链接发送未知长度内容的问题。

  • 另一个相关的是KeepAliveTimeout在Apache Core中的设置说明: 
Apache在关闭持久连接前等待下一个请求的秒数。一旦收到一个请求,超时值将会被设置为Timeout指令指定的秒数。 对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。后最后还有一个相关的是

  • MaxKeepAliveRequests在Core中的说明: 
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。通过Apache的设置说明,我们已经能明白KeepAlive的原理。在对于一个包含许多图片的网页来说, 客户端会在瞬间发出多个HTTP请求,此时多次建立TCP连接会大大降低响应速度。 此时通过持续连接,可以允许用户在一个TCP连接中发出多个HTTP请求, 减少TCP连接建立次数,提高响应速度。我们可以通过access_log统计出连续HTTP请求出现的次数、间隔时间、访问量, 以确定 MaxKeepAliveRequests 和 KeepAliveTimeout 的值。 KeepAliveTimeout 太小发挥不了持续连接的作用;太大了,持续连接迟迟不断, 浪费TCP连接数不说,更糟糕的是系统中的 httpd 进程数目会因此不断增加, 使得系统负载升高,甚至会导致服务器失去响应。 但是当你的服务器只是在处理动态网页请求时,由于用户很少会瞬间请求多个动态网页 (一般都是打开页面之后阅读好半天才点下一页), 此时打开KeepAlive无异于浪费TCP连接数。哪么什么决定着我们是不是要开启KeepAlive的因素就很简单的确定出来了,就是说在用户一个页面请求中是否会向服务器发出多个HTTP的请求。
       对于我的哪个朋友,他们的服务器中有着动态应用,有着所有的图片,我看了一下,估算他们的首页中发出的请求类型为以下几种: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 尤其图片,一个服务器存放动态的页面请求,按照理论上来说,效果会更好,但是具体实际效果以及测试数据我现在并没有测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值