[FreeBSD] Lighttpd + PHP + mod_proxy + FastCGI

最近一直在玩 Lighttpd 這一套 web 的 daemon,我覺得這一套還蠻好用的,不像 Apache 掛載這麼多 module 結果吃還蠻大的資源,加上 Apache 預設跑 MPM prefork 所以如果大型網站大概就會掛掉,線上人數一堆,就會快撐不住了,所以用 MPM worker 或者是 MPM Event,然後 Lighttpd 本身還支援 mod_rewrite 的功能,可以參考我之前寫的 [FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks 問題,不過最近遇到一個很奇怪問題,那就是 Lighttpd 會自己掛點,但是我看 message 跟 error log 底下是:

2008-07-10 09:08:31: (server.c.1258) NOTE: a request for /wp-includes/js/scriptaculous/effects.js?ver=1.8.0 timed out after writing 32991 bytes. We waited 360 seconds. If this a problem increase server.max-write-idle

我發現,這個問題是還好,不過我參考了

gaslin 大神的這一篇lighttpd + FastCGI + PHP 時的問題,裡面提到FastCGI 跑 TCP socket 比較沒問題,但是用 UNIX 的 socket 會比較有問題,那我也參考了 Lighttpd 的 Wiki 上用 Handy External Spawning FastCGI PHP Processes in FreeBSD 這篇所提供的 script,下去跑,最近還在看看結果如何,那大致上作法如下: 1. 把 fastcgi-php.sh 下載到 /usr/local/etc/rc.d/ 裡面 2. 按到底下步驟

#
# 下面幾乎不用改
#
cd /usr/local/etc/rc.d/
chown root:wheel fastcgi-php.sh
chmod 544 fastcgi-php.sh
mkdir /var/run/fcgiphp
chown www:www /var/run/fcgiphp
3. 設定 /etc/rc.conf
#
# 基本 rc.conf 設定
#
# 開機啟動
fcgiphp_enable="YES"            
# fast-cgi 指令          
fcgiphp_bin_path="/usr/local/bin/php-cgi"    
fcgiphp_user="www"                       
fcgiphp_group="www"                      
fcgiphp_children="10"                    
fcgiphp_port="8002"
# 如果你要用 tcp socket 的話,那就是把 下面清空                      
fcgiphp_socket=""   
fcgiphp_env="SHELL PATH USER"            
fcgiphp_max_requests="500"               
fcgiphp_addr="localhost"         
4. 啟動 fast-cgi
# /usr/local/etc/rc.d/fastcgi-php.sh start
Starting fcgiphp.
# /usr/local/etc/rc.d/fastcgi-php.sh stop
Stopping fcgiphp.
# /usr/local/etc/rc.d/fastcgi-php.sh restart
Stopping fcgiphp.
Starting fcgiphp.
5. 修改 Lighttpd.conf
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "host" => "127.0.0.1",
                                   "port" => 8002,
                                   "bin-path" => "/usr/local/bin/php-cgi"
                                 )
                               )
                            )
這樣大致上完成了。 介紹一下

Lighttpdmod_proxy 功能,目前把圖片存放到另外一台,然後用 proxy 的功能導過去 設定如下:

$HTTP["host"] == "pic.wu-boy.com" {
  accesslog.filename = "/var/log/lighttpd/pic.wu-boy.com-access_log"
  proxy.server = ( "" =>
                     ( (
                       "host" => "140.123.107.54",
                       "port" => 80
                     ) )
                 )
}
這樣就可以達到你想要的功能了

See also