Apache與瀏覽器之間的併發,連接,請求

併發(併發數量):就是apache的併發數量,更直接就是apache爲了處理用戶請求開啓的進程數量,簡單理解就是apache的進程數量。
連接(TCP連接):apache和瀏覽器之間是通過TCP/IP協議進行通信的,這裏的連接就是apache和瀏覽器之間的TCP連接。
請求(瀏覽器的請求):apache服務器一直監聽80端口,不會發起主動請求。而瀏覽器會向apache發起連接請求。這裏講的請求就是瀏覽器的請求。

一個瀏覽器能發起幾個請求?是什麼限制瀏覽器發起請求?
答案:無數,如果用戶的電腦配置允許。
這個應該是廢話,瀏覽器在客戶端,用戶想發幾個就發幾個請求。限制條件應該是用戶的電腦配置吧。一般一臺電腦開幾百個瀏覽器對同一個網站發請求應該是沒有問題。

是不是每個瀏覽器的請求都能夠建立連接?是什麼限制了瀏覽器和apache的連接數?
答案:不是所有請求都會建立連接,限制是linux操作系統上,或者說apache所在的操作系統。
既然瀏覽器可以發起無數個請求,那麼能不能成功建立連接就是服務端的事情。那麼到底是apache限制了最大的連接數還是linux限制了最大的連接數?還是PHP限制了最大連接數?或者說是mysql限制了最大連接數?
答案:linux限制了瀏覽器和apache之間的最大連接數。下面就通具體的測試來回答。
首先我們假設是apache限制了最大連接數。打開apache的httpd.conf文件。找了半天發現只有下這一段跟最大連接數有點關係。
參數:

StartServers 1
MinSpareServers 1
MaxSpareServers 2
ServerLimit 256
MaxClients 3
MaxRequestPerChild 4000

測試環境:
服務器
虛擬機上的centOS4.5
客戶端
本機上的IE瀏覽器
服務器地址
192.168.212.128
客戶端地址
192.168.212.1

訪問文件

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

通過10個IE瀏覽器模擬10個用戶同時對apache發起請求:(基本同時訪問)
通過netstat命令可以看到這10個請求都建立了連接。
#netstat -nt|grep –i '80'
再看看apache的情況:
#ps –U apache u

第一次同時訪問時候apache只啓用了3個進程處理前三個用戶的請求。

過10*10秒之後再看看連服務器的連接狀態和apache進程狀態。

可以看到第一批3個用戶的請求處理完畢,3個連接狀態爲TIME_WAIT。
可以從前面的IE瀏覽器打印的內容看到最後的響應時間爲18:20:35。
要知道這個時候另外7個頁面還是在載入中。可以看到這7個瀏覽器的進度條在走,而不是沒有響應,也沒有提示403等錯誤。

看到apache的進程還是隻有3個,因爲上面的MaxClients=3限制了最大的進程數爲3。而不會開啓多餘的進程處理請求。

再看看過了2*10*10秒後的狀態。

可以看到第一批3個用戶的連接已經斷開,第二批3個用戶的請求已經處理完畢,
正在準備斷開連接,TIME_WAIT會在2*SML秒後進入 CLOSED狀態。即斷開連接。
可以從前面IE瀏覽器打印的內容看到開始響應時間爲18:20:52。最後響應時間爲18:22:32。
第一批和第二批瀏覽器已經顯示完畢,剩下的4個瀏覽器狀態是正在載入中,可以看到進度條在走動。

看到apache的進程還是隻有3個。

再看看過了3*10*10秒後的狀態。

可以看到這時前面的6個連接都已經斷開,第三批瀏覽器的請求已經處理完畢正在準備斷開連接,
TIME_WAIT會在2*SML秒後進入CLOSED 狀態。即斷開連接。
可以從前面IE瀏覽器打印的內容看到開始響應時間爲18:22:42。最後響應時間爲18:24:22。
第一批,第二批,第三批瀏覽器已經顯示完畢,剩下的1個瀏覽器狀態是正在載入中,可以看到進度條在走動。

看到apache的進程還是隻有3個。

再看看過了4*10*10秒後的狀態。

可以看到這時前面的9個連接都已經斷開,第四批瀏覽器的請求已經處理完畢正在準備斷開連接,
TIME_WAIT會在2*SML秒後進入CLOSED 狀態。即斷開連接。
可以從前面IE瀏覽器打印的內容看到開始響應時間爲18:24:25。最後響應時間爲18:26:05。
第一批,第二批,第三批,第四批瀏覽器全部顯示完畢。

可以看到apache的進程已經減少爲2個。

測試得到的結論
上面的測試可以看到,瀏覽器與apache之間的最大TCP連接數不是有apache限制的。
apache工作模式中MaxClients等參數只是限制了apache的進程數量,並沒有限制瀏覽器和apache的連接數量。
就算apache的進程已經到達MaxClients的最大數,其他瀏覽器還是可以訪問。
而且訪問也不會拒絕,只是在等待apache的進程將前面的請求處理完,再處理這些沒有響應的請求。

爲什麼apache不能限制最大的TCP連接數呢?
答案:TCP連接是在鏈路層,apache是基於http協議的在應用層。

下面看看linux是怎麼限制TCP連接的最大數的。
首先使用sysctl -a命令看看linux下面的系統配置參數。
#sysctl –a

看到這麼多系統配置參數,是不是有個參數可以控制TCP的最大連接數呢?

找了很久,沒有發現可以直接控制TCP最大連接數的參數,
每個連接成立以後linux都會對其進行維護(並且創建維護文件,linux的防火牆就是根據這個文件的)。
發現有個參數ip_conntrack_max就是這個維護文件最大數。(可以使用modprobe ip_conntrack開始這個參數。
可以使用#less /proc/net/ip_conntrack|wc –l 查看當前已經建立的該文件數,連接斷開後這個文件也會關閉)
#sysctl -a|grep ip_conntrack_max

雖然看到兩個,但是這兩個文件是同步的,修改後會自動同步。
我們把它的值修改爲1,雖然有點極端,但是可以很好解釋爲很麼是linux限制了瀏覽器的最大TCP連接數。
#echo 1 > ip_conntrack_max

使用兩個IE瀏覽模擬2個用戶同時訪問apache。使用netstat命令查看。
#netstat -nt|grep –i '80'

看到問題了吧。只有一個連接,第二個訪問的瀏覽根本就沒有反應。

測試得到的結論
在我們把ip_conntrack_max設置爲1的時候,瀏覽器不管發送多少請求,linux只會和它建立一個連接。
那麼linux沒有專門的值來控制TCP連接的最大數呢?有,只不是linux把個限制的條件細化了。
比如:同時可以建立多少CLOSE_WAIT 狀態的連接數,同時可以建立多少個TIME_WAIT狀態的連接數,等等等。
所以想要控制apache的最大連接數,需要通過配合這些數據進行組合。

總結
如果認真讀完上面的內容,會的到下面的結論。
1.用戶的瀏覽器可以對apache發起N個請求。N的數值可能會很大。
2.只有M(M小於N)個請求會跟apache建立連接(只是建立連接,並不是處理)。
  而這個M的值是由linux服務器控制。linux會根據硬件的情況會給出默認值。
  我們可以通過各個參數的組合來計算最後的TCP連接數的最大限制。
3.只有P(P小於M)個連接會得到apache的處理。apache會建立P個進程處理這P個連接。
  這個P的值是apache的MaxClients等參數控制的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章