
如果這是一個基本問題,我提前道歉,但在閱讀 Apache 文件和其他教程後我很困惑。
單一 Apache prefork 進程是否為給定客戶端提供所有 HTTP 請求?這就是我的想法,但是當我將 maxclients 減少到較低的數字時,我的頁面載入時間就會變得緩慢。儘管事實上我是相關伺服器上唯一的客戶端。這表示每個進程一次服務一個 HTTP 請求,而不是服務逾時視窗內的所有請求。
因此,如果單一網頁需要 15 個 HTTP 請求才能完全加載,我是否需要 15 個預派生 Apache 進程才能為其提供最佳服務?
答案1
按照我們通常思考 HTTP 協定的方式,這不應該是一個問題。
現代瀏覽器使用活著連接,一次只能承載一個請求;從這個意義上說,使用MaxClients 1
不應該產生影響,因為這些連接中的每個請求都是在下一個請求開始之前完成的。
然而,這是現代瀏覽器的另一回事。他們使用多個連接。如今,您可能會得到一個需要加載 40 個其他資源的 html 頁面;圖像、JavaScript、CSS。從效率的角度來看,將它們全部堆放在單一檔案中透過一個連接發送並沒有多大意義;相反,它們被分成幾個連接(每個連接仍然是單個檔案)以同時獲取。
我找不到關於每個瀏覽器行為的良好權威資訊來源,但是我能找到什麼表示 6 個連接是正常的。這就是伺服器並發性發揮作用的地方;這 6 個連線中的每一個都可以同時請求資源,從伺服器的角度來看,它們充當 6 個不同的客戶端。
答案2
mpm_prefork
只會應答一個連接。如果您希望 apache 為每個進程提供多個連接,您將需要使用多線程 MPM,例如mpm_worker
.
現代瀏覽器使用管道(多個同時連接)和保持活動(同一連接上的串行請求)來提高吞吐量和網路效率並降低延遲。例如,Mozilla Firefox 可以透過變更network.http.pipelining
和network.http.pipelining.maxrequests
進行配置about:config