日期:2014-05-16  浏览次数:20806 次

【转】浏览器,apache的连接超时详解

前言

要理解浏览器和apache之间的连接超时问题,需要先明白http的keep-alive属性。先简单介绍keep-alive,您可以从网上查找更加详细的介绍。

浏 览器和apache都是基于http协议的。而http协议中的keep-alive属性通俗的解释就是浏览器和apache第一次建立TCP连接,传输 完数据不会立刻断开这个TCP连接,而是继续等待下一个请求。保持一段时间(keep-alive-time)后才会断开连接。

下面做个测试,查看apache在打开keep-alive支持和关闭keep-alive支持时候的TCP连接状态。

?

?

服务端 虚拟机上的Centos
客户端 本机上IE6浏览器
服务端地址 192.168.212.128
客户端地址 192.168.212.1
访问的文件test.html
	

<html xmlns="http://www.w3.org/1999/xhtml">  

<head>  

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

<link rel="stylesheet" type="text/css" href="./main.css" />  

<script type="text/javascript" src="./main.js"></script>  

</head>  

<body>  

您知道吗?A处和B处的色值是一样的。<br/>  

<img src="./main.jpg">  

</body>  

</html>  
?

首先关闭apache的keep-alive参数,打开httpd.conf。

image

打开浏览器访问apache。使用netstat命令查看连接状态。

#netstat –nt|grep –i ’80′

image

可以看到四个连接,因为本地访问速度很快,只能抓取到TIME_WAIT得状态。那一个test.html网页为什么会有四个连接呢?

看test.html的内容可以知道有:

1,main.css 文件

2,mian.js?? 文件

3,main.jpg 图片

4,本身的test.html文件

所以有四个连接。

再看看关闭apache的keep-alive支持后的连接状态。

image

重启服务器,浏览器访问test.html,在查看连接。

#service httpd restart

#netstat –nt|grep –i ’80′

image

可以看到只有一个连接。而且这个连接状态是ESTABLISHED。我们在httpd.conf中设置了keepAlliveTimeout=15,所以连接建立后15秒后才关闭连接。

image

测试得到的结论

如果关闭apache的keep-alive属性,访问的页面中的(上例中test.html)所有文件,包括js,css,图片等等都要建立新的TCP连接。有多少引用文件就建立多少个连接。具体多少个文件可以使用火狐的BUG工具查看。

image

上图中最下面的11个请求就是该网页中需要引用的文件数。

如果开启apache的keep-alive属性,访问的页面中的(上例中的test.html)所有文件,包括js,css,图片等等只建立一个TCP连接,按照顺序传输所有数据。所有数据传输完等待KeepAliveTimeout =15秒后再关闭该连接。

网上看到的参考:

假 如当前Apache每秒响应100个用户访问,KeepAliveTimeOut=5,此时httpd进程数就是100*5=500个(prefork模 式),一个httpd进程消耗5M内存的话,就是500*5M=2500M=2.5G,夸张吧?当然,Apache与Client只进行了100次TCP 连接。如果你的内存够大,系统负载不会太高,如果你的内存小于2.5G,就会用到Swap,频繁的Swap切换会加重CPU的Load。

现 在我们关掉KeepAlive,Apache仍然每秒响应100个用户访问,因为我们将图片、js、css等分离出去了,每次访问只有1个 request,此时httpd的进程数是100*1=100个,使用内存100*5M=500M,此时Apache与Client也是进行了100次 TCP连接。性能却提升了太多。

浏览器的连接超时

每个浏览器都有默认的连接超时时间。IE6的默认时间为60分钟。

这个值可以通过注册表修改。

1,打开注册表:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。

2,增加一个DWORD值的项,命名为ReceiveTimeout,设置1000。该值的默认单位是毫秒,这里设置的1秒时间。

从浏览器开始访问网站开始,1秒后关闭连接。(设的值有点极端,但是方便展示)。

重启浏览器访问网站。

服务端 虚拟机上的Centos
客户端 本机上IE6浏览器
服务端地址 192.168.212.128
客户端地址 192.168.212.1
访问的文件index.php
<?php  

echo date('H:i:s',