apache的主要工作模式有兩種:prefork和worker
一、兩種模式
prefork模式(預設模式)
prefork是unix平台上的預設(預設)mpm,使用多個子程序,每個子程序只有乙個執行緒。每個程序在某個確定的時間只能維持乙個連線,效率高,但記憶體佔用量比較大。
這個多路處理模組(mpm)實現了乙個非執行緒型的、預派生的web伺服器,它的工作方式類似於apache 1.3。它適合於沒有執行緒安全庫,需要避免執行緒相容性問題的系統。它是要求將每個請求相互獨立的情況下最好的mpm,這樣若乙個請求出現問題就不會影響到其他請求。
worker模式
worker使用多個子程序,每個子程序有多個執行緒,每個執行緒在某個確定的時間只能維持乙個連線,記憶體佔用量比較小,適合高流量的http伺服器。缺點是假如乙個執行緒崩潰,整個程序就會連同其任何執行緒一起」死掉」,所以要保證乙個程式在執行時必須被系統識別為」每個執行緒都是安全的」。
此多路處理模組(mpm)使網路伺服器支援混合的多執行緒多程序。由於使用執行緒來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於程序的mpm。但是它也使用了多程序,每個程序又有多個執行緒,以獲得基於程序的mpm的穩定性。
二、模式切換
1.檢視模式
如果apache已經安裝,我們可以用"httpd -l"命令檢視當前模式。若找到 prefork.c 則表示當前工作在prefork模式,同理出現 worker.c 則工作在worker模式。
如果apache還未安裝,我們在編譯的時候可以加入 --with-pem=(prefork|worker) 選項決定啟用什麼模式。
2.切換模式
a. 將當前的prefork模式啟動檔案改名
mv httpd httpd.preforkb. 將worker模式的啟動檔案改名
mv httpd.worker httpdc. 修改apache配置檔案
d. 重新啟動服務
/usr/local/apache2/bin/apachectl restart出於穩定性和安全性考慮,不建議更換apache2的執行方式,使用系統預設prefork即可。另外很多php模組不能工作在worker模式下,例如redhat linux自帶的php也不能支援執行緒安全。所以最好不要切換工作模式。
三、prefork和worker模式比較
prefork模式使用多個子程序,每個子程序只有乙個執行緒。每個程序在某個確定的時間只能維持乙個連線。在大多數平台上,prefork mpm在效率上要比worker mpm要高,但是記憶體使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好執行緒安全的第三方模組,並且對於那些執行緒除錯困難的平台而言,它也更容易除錯一些。
worker模式使用多個子程序,每個子程序有多個執行緒。每個執行緒在某個確定的時間只能維持乙個連線。通常來說,在乙個高流量的http伺服器上,worker mpm是個比較好的選擇,因為worker mpm的記憶體使用比prefork mpm要低得多。但worker mpm也由不完善的地方,如果乙個執行緒崩潰,整個程序就會連同其所有執行緒一起"死掉"。由於執行緒共享記憶體空間,所以乙個程式在執行時必須被系統識別為"每個執行緒都是安全的"。
總的來說,prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。
(如果要想用worker模式,還不如使用nginx)
四、prefork模式配置詳解(根據官網翻譯的)
serverlimit 256serverlimitstartservers 5
minspareservers 5
maxspareservers 10
maxclients 256
maxrequestsperchild 0
預設的maxclient最大是256個執行緒,如果想設定更大的maxclient值,就的設定這個serverlimit引數。20000是serverlimit這個引數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯apache。生效前提:必須放在其他指令的前面。如果這個引數設定的值很高,那麼就會申請很多的無用共享記憶體。如果serverlimit和maxclients都設定成乙個很高的值,超過了系統的處理範圍,那麼apache很可能不會啟動或者系統變得不穩定。
startservers
指定伺服器啟動時建立的子程序數量。因為程序的數量是根據負載來動態控制得,所以這個引數可以不用修改。prefork預設為5。
minspareservers
指定空閒子程序的最小數量,預設為5。如果當前空閒子程序數少於minspareservers ,那麼apache將以最大每秒乙個的速度產生新的子程序。此引數不要設的太大。
maxspareservers
設定空閒子程序的最大數量,預設為10。如果當前有超過maxspareservers數量的空閒子程序,那麼父程序將殺死多餘的子程序。此引數不要設的太大。如果你將該指令的值設定為比minspareservers小,apache將會自動將其修改成"minspareservers+1"。
maxclients
限定同一時間客戶端最大接入請求的數量(單個程序併發執行緒數),預設為256。任何超過maxclients限制的請求都將進入等候佇列,一旦乙個鏈結被釋放,佇列中的請求將得到服務。要增大這個值,你必須同時增大serverlimit。
maxrequestsperchild
每個子程序在其生存期內允許處理的最大請求數量,預設為10000.到達maxrequestsperchild的限制後,子程序將會結束。如果 maxrequestsperchild為"0",子程序將永遠不會結束。將maxrequestsperchild設定成非零值有兩個好處:
1. 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
2. 給程序乙個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。
六、總結
以前apache主流模式為prefork,現在worker模式也開始多了起來,區別來說,worker模式可以應對高流量,但是安全性不太好;prefork模式安全性比較好,但是效能會差一點,各位可以根據自己伺服器的類別選取不同的模式,更好的使用apache。
合理設定apache的最大連線數
1.在 設定?伺服器的為freebsd 6.2 apache 2.24,使用預設配置 freebsd 預設不載入自定義mpm配置 預設最大連線數是250 在 usr local etc apache22 httpd.conf中載入mpm配置 去掉前面的注釋 可見的mpm配置在 usr local e...
合理設定apache httpd的最大連線數
來自 1.在 設定?伺服器的為freebsd 6.2 apache 2.24,使用預設配置 freebsd 預設不載入自定義mpm配置 預設最大連線數是250 在 usr local etc apache22 httpd.conf中載入mpm配置 去掉前面的注釋 可見的mpm配置在 usr loca...
合理設定apache httpd的最大連線數
1.在 設定?伺服器的為freebsd 6.2 apache 2.24,使用預設配置 freebsd 預設不載入自定義mpm配置 預設最大連線數是250 在 usr local etc apache22 httpd.conf中載入mpm配置 去掉前面的注釋 可見的mpm配置在 usr local e...