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

併發(併發數量):就是apache的併發數量,更直接就是apache爲了處理用戶請求開啓的進程數量,簡單理解就是apache的進程數量。
鏈接(TCP鏈接):apache和瀏覽器之間是經過TCP/IP協議進行通訊的,這裏的鏈接就是apache和瀏覽器之間的TCP鏈接。
php


請求(瀏覽器的請求):apache服務器一直監聽80端口,不會發起主動請求。而瀏覽器會向apache發起鏈接請求。這裏講的請求就是瀏覽器的請求。

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

是否是每一個瀏覽器的請求都可以創建鏈接?是什麼限制了瀏覽器和apache的鏈接數?
答案:不是全部請求都會創建鏈接,限制是linux操做系統上,或者說apache所在的操做系統。
既然瀏覽器能夠發起無數個請求,那麼能不能成功創建鏈接就是服務端的事情。那麼究竟是apache限制了最大的鏈接數仍是linux限制了最大的鏈接數?仍是PHP限制了最大鏈接數?或者說是mysql限制了最大鏈接數?
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的最大鏈接數,須要經過配合這些數據進行組合。

總結
若是認真讀完上面的內容,會的到下面的結論。
linux


1.用戶的瀏覽器能夠對apache發起N個請求。N的數值可能會很大。
2.只有M(M小於N)個請求會跟apache創建鏈接(只是創建鏈接,並非處理)。
  而這個M的值是由linux服務器控制。linux會根據硬件的狀況會給出默認值。
  咱們能夠經過各個參數的組合來計算最後的TCP鏈接數的最大限制。
3.只有P(P小於M)個鏈接會獲得apache的處理。apache會創建P個進程處理這P個鏈接。
  這個P的值是apache的MaxClients等參數控制的。
sql

相關文章
相關標籤/搜索