那么什么時(shí)候Lighttpd和PHP的搭配更值得選擇呢?可以從以下幾點(diǎn)考慮:如果訪(fǎng)問(wèn)量比較大,硬件資源吃緊,那么Lighttpd適合你;如果和穩定相比,你傾向速度多一些,那么Lighttpd適合你。
題外話(huà):NginX大有趕超Lighttpd的態(tài)勢。
Lighttpd的安裝,本文就不多說(shuō)了,大家自己搜索一下就能找到大把大把的教程。這里我們著(zhù)重討論一下Lighttpd的配置。
安裝好Lighttpd+PHP后,你的配置很可能是類(lèi)似下面的代碼:
fastcgi.server = ( ".php" =>
(( "socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/bin/php-cgi",
"max-procs" => 10,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "1000"
),
"broken-scriptfilename" => "enable"
))
)
其中,PHP_FCGI_MAX_REQUESTS的作用是在一個(gè)子進(jìn)程工作一定次數后就干掉它,以免可能出現的問(wèn)題連累系統,主進(jìn)程會(huì )再創(chuàng )建一個(gè)相應的子進(jìn)程來(lái)替補,保證子進(jìn)程數一直是PHP_FCGI_CHILDREN個(gè)。
另外還有兩個(gè)設置選項至關(guān)重要,分別是max-procs和PHP_FCGI_CHILDREN。如上所示的配置,系統將創(chuàng )建170個(gè)PHP-cgi的進(jìn)程,它的計算公式如下:
num-procs = max-procs * ( 1 + PHP_FCGI_CHILDREN )
如果一個(gè)php-cgi進(jìn)程占用十幾兆內存的話(huà),那么總計大約就要占用2G左右的內存。
我們先來(lái)看看max-procs的意思:從字面意思看,它似乎指得是最大進(jìn)程數。實(shí)際它指的是Lighttpd一開(kāi)始spawn多少個(gè)進(jìn)程。
至于PHP_FCGI_CHILDREN的意思,和字面意思相同,指的就是每個(gè)主進(jìn)程里產(chǎn)生多少個(gè)PHPFCGI子進(jìn)程。
如果你的Lighttpd已經(jīng)啟動(dòng),你可以嘗試執行一下命令:ps aux | grep php-cgi,將會(huì )看到大量的php-cgi進(jìn)程:
nobody 10939 0.0 0.1 15556 4820 ? Ss 16:24 0:00 /usr/local/bin/php-cgi
nobody 11380 0.0 0.1 15452 5588 ? S 16:24 0:00 /usr/local/bin/php-cgi
仔細觀(guān)察,你會(huì )發(fā)現這些php-cgi的狀態(tài)不盡相同,有的是Ss,有的是S,通過(guò)man ps你能找到這些狀態(tài)的含義:
S Interruptible sleep (waiting for an event to complete)
s is a session leader
也就是說(shuō),Ss狀態(tài)的進(jìn)程都是主進(jìn)程(max-procs代表的那些進(jìn)程),而S狀態(tài)的進(jìn)程都是子進(jìn)程(PHP_FCGI_CHILDREN代表的那些進(jìn)程)。如果不相信,你可以使用命令核實(shí)一下數量:
ps aux | grep php-cgi | grep Ss | grep -v grep | wc -l
確認了這些,我們再仔細看ps aux | grep php-cgi的結果,你還會(huì )發(fā)現主進(jìn)程的內存占用(4840)和子進(jìn)程的內存占用(5588)是不同的。這是因為主進(jìn)程不處理實(shí)際的PHP請求,它唯一的工作就是看管好自己手下的子進(jìn)程。而實(shí)際的PHP請求都是由子進(jìn)程來(lái)完成的,所以子進(jìn)程占用的內存要稍大一些。
如此,我們對max-procs和PHP_FCGI_CHILDREN的含義應該理解了吧,別急,還有一個(gè)問(wèn)題:既然php-cgi的總進(jìn)程數可以由上面的公式算出來(lái),那么以下幾個(gè)配置選項哪個(gè)好?
"max-procs" => 1,
"PHP_FCGI_CHILDREN" => "169",
"max-procs" => 2,
"PHP_FCGI_CHILDREN" => "84",
"max-procs" => 10,
"PHP_FCGI_CHILDREN" => "16",
以上三種配置產(chǎn)生的總進(jìn)程數一樣(都是170),我們如何判斷配置的好壞呢?
如果使用了eAccelerator之類(lèi)的PHP優(yōu)化器,那么eAccelerator會(huì )為每一個(gè)主進(jìn)程創(chuàng )建一個(gè)獨立的緩存空間,這個(gè)時(shí)候如果你的max-procs是2的話(huà),就會(huì )建立兩個(gè)獨立的緩存空間。一方面這浪費了一些內存,另一方面如果你的一個(gè)主進(jìn)程掛了(它下面的子進(jìn)程就失控了),至少你還有一個(gè)主進(jìn)程可以保持正常運轉。
總體來(lái)說(shuō),max-procs不宜為較小,否則沒(méi)有容錯性,在有PHP優(yōu)化器的時(shí)候也不宜過(guò)大,否則會(huì )浪費很多內存做緩存空間,即便沒(méi)有裝PHP優(yōu)化器,max-procs也不宜過(guò)大,因為主進(jìn)程是不處理PHP請求的,過(guò)多的主進(jìn)程自然就是一種浪費。確定了max-procs的值,剩下PHP_FCGI_CHILDREN的值就好說(shuō)了。
另外:通過(guò)命令netstat -anp | grep php-cgi | wc -l可以得知當前有多少php-cgi處于連接狀態(tài),如果接近php-cgi的總進(jìn)程數,就說(shuō)明應該加大進(jìn)程數了。
補充:
- Add cgi.fix_pathinfo = 1 in your php.ini
- Add "broken-scriptfilename" => "enable" into lighttpd.conf at fastcgi.server section.
---------------------------------------------
參考連接:
http://trac.lighttpd.net/trac/wiki/Docs%3AModFastCGI
http://trac.lighttpd.net/trac/wiki/FrequentlyAskedQuestions

