問題php
在Prima/Plesk/Virtuozzo上,apache都使用了系統自帶的httpd-2.0.5x的rpm包linux
在redhat linux上,默認使用的是prefork模式,而不是worker模式web
如何在兩者間切換?apache
解決方案服務器
Apache HTTP服務器被設計爲一個強大的、靈活的可以在多種平臺以及不一樣環境下工做的服務器。網絡
不一樣的平臺和不一樣的環境常常產生不一樣的需求,或是爲了達到一樣的最佳效果而採用不一樣的方法。多線程
Apache憑藉它的模塊化設計很好的適應了大量不一樣的環境。併發
這一設計使得網站管理員可以在編譯時和運行時憑藉載入不一樣的模塊來決定服務器的不一樣附加功能。ide
Apache2.0將這種模塊化的設計延伸到了web服務器的基礎功能上。模塊化
這個版本帶有多路處理模塊(MPM)的選擇以處理網絡端口綁定、
接受請求並指派子進程來處理這些請求。
好比,須要更好伸縮性的能夠選擇象worker或event這樣線程化的MPM,
而須要更好的穩定性和兼容性以適應一些舊的軟件能夠用prefork 。
在Redhat Linux的主要版本as4上,apache版本爲httpd-2.0.5x,
默認爲prefork模式,主要是考慮到穩定性的緣由。
要切換到worker模式,則須要登陸到linux上,進行以下操做:
進入/usr/sbin目錄
cd /usr/sbin
將當前的prefork模式啓動文件更名
mv httpd httpd.prefork
將worker模式的啓動文件更名
mv httpd.worker httpd
修改配置文件vi /etc/httpd/conf/httpd.conf
找到裏邊的以下一段,可適當修改負載等參數:
StartServers 5
ThreadLimit 200
ServerLimit 50
MaxClients 2000
MinSpareThreads 25
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 50
從新啓動服務
/etc/init.d/httpd restart
便可換成worker方式啓動apache2
總結:
1. prefork 中沒有線程的概念,是多進程模型,一個進程處理一個鏈接;穩定;響應快。其缺點是在鏈接數比較大時就很是消耗內存。
2. worker 是多進程多線程模型,一個進程有多個線程,每一個線程處理一個鏈接。與prefork相比,worker模式更節省系統的內存資源。不過,須要注意worker模式下的Apache與php等程序模塊的兼容性。
3. event 是worker模式的變種,它把服務進程從鏈接中分離出來,在開啓KeepAlive場合下相對worker模式可以承受的了更高的併發負載。event模式不能很好的支持https的訪問(HTTP認證相關的問題)。