情況是這樣: windows7下, 使用Apache搭建的web服務器! 在瀏覽器輸完網址后,訪問本地搭建的網站,第一次網頁打開非常慢,Apache響應非常的慢,但是大概要3~5s,但是等頁面打開后,再打開頁面中的其他鏈接的時候,速度是非常快的! 之后,不對網頁進行操作,過一會兒,再打開頁面上的鏈接,速度又會和首次打開主頁一樣慢
使用的是Wamp搭建的環境,系統為Windows7和 apache 2.4.4
解決辦法如下,
Apache的線程數控制文件為http-mpm.conf,在conf/exrtra目錄下面(我的文件目錄為D:\wamp\bin\apache\Apache2.4.4\conf\extra),要使該配置文件起作用需要在httpd.conf 中將 Include conf/extra/httpd-mpm.conf前#去掉,以使得http-mpm.conf生效。 在Windows系統中,起作用的是Winnt mpm段,搜索 mpm_winnt_module 把 <IfModule mpm_winnt_module> ThreadStackSize 8388608 ThreadsPerChild 150 MaxConnectionsPerChild 0 </IfModule>
修改為 <IfModule mpm_winnt_module> ThreadStackSize 8388608 ThreadsPerChild 350 MaxConnectionsPerChild 10000 </IfModule>
而且應該同時修改httpd-default.conf超時設置來配合。 在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#使httpd-default.conf生效。 其中調節以下參數 Timeout 15 (連接超時缺省為300,太大了,縮小會減少同時連接數,即上面占用的實際線程數) KeepAlive On (開啟可以提高性能,因為一個頁面一般會有多個請求) MaxKeepAliveRequests 50 (這個數目自己根據網頁內容調節) KeepAliveTimeout 5 (這個小於Timeout就行)
最后重啟apache 即可。
ThreadStackSize指令用來處理客戶端連接的線程使用的棧尺寸(字節)。其語法格式為:ThreadStackSize size,在NetWare系統中默認值為65 536;其他系統中等於操作系統默認值。 ThreadStackSize指令設置了處理客戶端連接(包括調用模塊以協助處理)的線程允許使用的最大棧尺寸(字節)。在大多數情況下,操作系統默認的棧尺寸很合理,但是在某些情況下,需要調整這個值。如,在默認棧尺寸較小的平台上(比如HP-UX),Apache可能會在使用一些需要較大棧尺寸的第三方模塊時崩潰。這樣的問題可以通過將ThreadStackSize設置為一個較大的值來解決。這種調整應當僅僅在第三方模塊提供者明確要求的情況下才需要,或者是通過診斷確定是由於棧空間太小而導致崩潰。 而在某些平台上,如果默認的棧空間大於服務器運行所需空間,那么將ThreadStackSize值降低到小於操作系統默認值可以讓每個進程中允許生成的最大線程數量增加。這種類型的調整應該僅在測試環境中使用,並且對所有服務器進程進行充分的測試,因為處理某些罕見的請求需要較大的棧空間。一個很小的服務器配置變化就有可能使得當前的ThreadStackSize設置變得不合適。
ThreadsPerChlid是Apache進程的子線程數,這個指令設置了每個子進程建立的線程數。子進程在啟動時建立這些線程后就不再建立新的線程了。如果使用一個類似於mpm_winnt只有一個子進程的mpM,這個數值要足夠大,以便可以處理可能的請求高峰。如果使用一個類似於worker有多個子進程的mpM,每個子進程所擁有的所有線程的總數要足夠大,以便可以處理可能的請求高峰。 該參數需要根據 apache-status實時的監控情況來調節,太大會導致內存增長過快,直到服務器當機,太小會導致服務器連接隊列在高峰期時占滿,從而導致網站連接 慢。同時我們應該修改另一個配置文件httpd-default.php中的超時設置來配合這個參數。 對於mpm_winnt,ThreadsPerChild的默認值是64;對於其他mpM是25。 MaxRequestsPerChild是進程的最大的請求數目,既指網站收到請求的緩存數。設置太小了會影響服務器性能,因為會占用較多cpu時間,太大了則會占用內存資源。一般大型的網站文件個數都是成千上萬,所以管理員應該根據網站情況自己設定。 MaxRequestsPerChild指令設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。 在mpm_netware和mpm_winnt上的默認值是"0"。 將MaxRequestsPerChild設置成非零值有兩個好處: a)可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。 b)給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。 注意:對於KeepAlive鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大鏈接數量的行為。