瀏覽器、apache的連線逾時詳解

來源:互聯網
上載者:User

前言

要理解瀏覽器和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。

開啟瀏覽器訪問apache。使用netstat命令查看串連狀態。

#netstat –nt|grep –i ’80′

可以看到四個串連,因為本地訪問速度很快,只能抓取到TIME_WAIT得狀態。那一個test.html網頁為什麼會有四個串連呢。

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

1,main.css 檔案

2,mian.js   檔案

3,main.jpg 圖片

4,本身的test.html檔案

所以有四個串連。

再看看關閉apache的keep-alive支援後的串連狀態。

重啟伺服器,瀏覽器訪問test.html,在查看串連。

#service httpd restart

#netstat –nt|grep –i ’80′

可以看到只有一個串連。而且這個串連狀態是ESTABLISHED。我們在httpd.conf中設定了keepAlliveTimeout=15,所以串連建立後15秒後才關閉串連。

測試得到的結論

如果關閉apache的keep-alive屬性,訪問的頁面中的(上例中test.html)所有檔案,包括js,css,圖片等等都要建立新的TCP串連。有多少引用檔案就建立多少個串連。具體多少個檔案可以使用Firefox的BUG工具查看。

上圖中最下面的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',time());  
sleep(10);  
?>  

可以看到瀏覽器顯示找不到伺服器,但是訪問剛才的test.html是可以訪問的。

訪問index.php顯示串連不成功。因為index.php中sleep(10)延遲10秒的函數。而IE6的連線逾時時間為1秒。所以就串連失敗了。

訪問test.hml可以成功串連。因為是訪問本機伺服器,傳輸速度很快,在IE6的1秒逾時時間之內就已經傳完全部資料了。

測試得到的結論

IE6的預設連線逾時時間為60分。可以通過註冊表中ReceiveTimeout值修改該值。

實際作用:使用IE6往伺服器上傳一個大檔案,如果上傳時間超過60分鐘就會中斷連線。

這也是為什麼有些網站要專門開發active外掛程式來實現IE6的大檔案上傳了。使用者是不會主動修改這個值的。

apache的連線逾時

看apache的設定檔可以看到有個timeout值。

 

有人會以為這個是apache的連線逾時參數。

我們把它設定為timeout =1訪問index.php。

看到還是可以訪問的,那麼這個timeout不是apache的連線逾時時間。timeout是apache收到上一個請求和後面一個請求到來之間的最大值。您可以查看瀏覽器與apache通訊中的TCP串連狀態遷移更加準確的明白timeout的值。

那麼apache的連線逾時時間到底是多少。是什麼參數控制呢。

答:apache沒有最大連線逾時時間,也沒有控制連線逾時的參數。因為apache是在TCP/IP模型的應用程式層。

那麼服務端是什麼控制了瀏覽器和apache之間的最大連線逾時時間呢。

答:linux

測試得到的結論

apache沒有最大連線逾時時間,也沒有控制連線逾時的參數。因為apache是在TCP/IP模型的應用程式層。

linux的連線逾時

在linux的系統配置中可以到關於連線時間的有這兩個參數。

#sysctl -a|grep time

一個是限制FIN_WAIT狀態的逾時時間,

一個是限制keepalive串連的逾時時間。

結論

linux的預設配置下也沒控制瀏覽器和apache連線逾時的參數,只有通過linux的防火牆才能控制apache和瀏覽器之間串連的最大連線時間。

PHP的操作逾時

開啟php.ini可以看到兩個參數。

max_execution_time:一個php程式執行的最長時間。

max_input_time:一個表單提交的最長時間。

這兩個值很重要。我們做個測試:

服務端 虛擬機器上的Centos
用戶端 本機上IE6瀏覽器
服務端地址 192.168.212.128
用戶端地址 192.168.212.1
訪問的檔案index.php
<?php  
for($i = 0;;$i++){  
 echo date('H:i:s',time());  
 echo '<br/>';  
 flush();  
}  
?>  

 

max_execution_time 30

 

訪問index.php。

 
<?php  
for($i = 0;;$i++){  
 echo date('H:i:s',time());  
 echo '<br/>';  
 flush();  
}  
?>  

30秒後IE死掉了。為什麼呢。答:index.php中有死迴圈。執行到max_execution_time=30秒後php停止了操作。瀏覽器這邊死掉了。

總結

如果從頭到尾看完上面的內容,會得出如下結論:

1,在用戶端,瀏覽器控制著瀏覽器和apache的最大連線逾時時間。

2,在服務端(不開啟防火牆),linux和apache都不能控制最大連線逾時時間,只有php或者mysql等運行程式通過控制自身的執行時間來控制瀏覽器和apache的最大連線逾時時間。

3,在服務端(開啟防火牆),linux上的防火牆和php,mysql等共同控制瀏覽器和apache的最大連線逾時時間。

4,這裡的瀏覽器和apache的最大連線逾時時間包括TCP串連中的所有狀態逾時時間的綜合。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.