2007-01-23

支援 PHP 的網頁伺服器 (lighttpd + FastCGI) 安裝設定

實際我在 WL-500g 上跑 thttpd 的最大問題是:不穩,容易自己當掉,所以如果要在 WL-500g 上跑一個 Web Server 而且還支援 PHP 的,還可以用另外一種作法:lighttpd + FastCGI。顧名思義,lighttpd 是個羽量級的 httpd,與 Apache 之類服務不同的是,為了精簡核心、減少耗用資源,這個服務原生只支援靜態的 HTML 文件編譯,也因此實際的效能比其他相同的服務高上幾倍,而且耗用的資訊也很低,很適合 WL-500g 這類玩意來用。可是也因為只支援靜態文件,所以 PHP 的解譯需要其他外掛的服務模組搭配使用,而 lighttpd 上的 PHP 外掛服務就是 FastCGI,只要同時安裝、並啟動這兩個服務,就可以用最有效率的資源運用去支援 Web + PHP 的服務了。

首先,先安裝 lighttpd (v1.4.12, 關連套件 pcre v5.05 也會被一併安裝):

ipkg install lighttpd

裝完之後 lighttpd 就被叫起來了,不過有些設定還沒調整好,可以先停掉它晚點再呼叫:

/opt/etc/init.d/S80lighttpd stop

接下來安裝 php 的 CGI 模組:FastCGI (v5.1.6, include php, php-fcgi, php-gd, libgd v2.0.33, libjpeg v6b, fontconfig v2.3.2, expat v2.0.0, gconv-modules v2.2.5)

ipkg install php-fcgi

裝完,然後編輯 lighttpd 的設定檔:

nano /opt/etc/lighttpd/lighttpd.conf

主要裡面要改的,像是 port number、文件目錄、log 檔的目錄和檔名,當然,還有關於 php cgi 的設定(紅色是提示修改的部分,在 nano 編輯器裡可以用 Ctrl+W 去搜尋關鍵字修改):

## bind to port (default: 80) -> 改 port
server.port                = 8080
## server.virtual-* options -> 改 Web 檔案目錄
server.document-root       = "/opt/public/www/"
#### accesslog module -> 改 log 檔路徑檔名
accesslog.filename         = "/opt/var/log/lighttpd_access.log"
## where to send error-messages to
server.errorlog            = "/opt/var/log/lighttpd_error.log"
## modules to load -> 移掉下面這行前面的 '#',啟動 fastcgi 模組支援
"mod_fastcgi",
## deny access the file-extensions -> 下面這行加入 .sqlite 支援,可有可無
url.access-deny            = ( "~", ".inc",".sqlite" )
#### fastcgi module -> 打開 cgi 支援, 記得 host 改成自己執行的 host IP,port 不要動
fastcgi.server             = ( ".php" =>
                                ((
                                    "host" => "192.168.1.254",
                                    "port" => 1026,
                                ))
                             )

改好存檔離開(Ctrl+k+x)。從上面最後一段可以看出來,讓 lighttpd 能夠支援 PHP,是因為跑了另外一個專門處理 PHP 的服務,叫做 fastcgi.server,而且要使用內部的 Port 1026,這個獨立的服務,執行檔是 /opt/bin/php-fcgi。接下來,要把這個用來 Serve PHP 的 CGI 服務跑起來,並且讓每次開機都會自動執行,所以我們要手動做一個自動執行檔在 /opt/etc/init.d/ 下:

nano /opt/etc/init.d/S45php

檔案內容如下:

#!/bin/sh
export PHP_FCGI_CHILDREN=1
PORT=1026
BIN=/opt/bin/php-fcgi
#/opt/etc/php.d
case $1 in
 start)
  $BIN -b $PORT &
  ;;
 stop)
  kill Pidof phpM  ;;
 *)
  echo "usage: $0 (start|stop)"
  exit 1
esac

改完存檔,並且記得改檔案屬性為可執行:

chmod +x /opt/etc/init.d/S45php

接著,重啟 lighttpd 以及 FastCGI,就可以測試看看 Web 和 PHP 能不能運作囉:

/opt/etc/init.d/S80lighttpd start
/opt/etc/init.d/S45php start

至於怎麼測試 Web 和 PHP 正不正常、在設定檔裡面為什麼 Server Port 要改成 8080、還有服務跑起來以後,怎麼設定防火牆讓外面的人能連進來,請參閱我的上一篇文章,關於設定目錄、修改防火牆和測試的部分,和本文都可以通用。

參考文章:
lighttp and php tutorial

回應: 15

Unknown 提到...

嗚,真是如沐春風,這麼詳盡的設定,等我的Server架完後,就要來好好『改造』一下我的WL500g,感謝版大的說明,一個字,讚!

Unknown 提到...

安裝LIGHTTPD時出現錯誤訊息:
ERROR: Cannot satisfy the following dependencies for lighttpd:
libstdc++ libstdc++

已經Update過ipkg,也看了一下系統安裝的Lighhtpd版本為1.4.13-7,比版大的版本又更新了一些。

將試著安裝thttpd來試試看穩定度。

Unknown 提到...

糟糕,看來我可能搞錯哪一個步驟了,連THTTPD也有錯誤訊息,如下:

admin@(none)[/tmp/local/root]:ipkg install php-thttpd
Installing php-thttpd (2.25b-5.2.0-4) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/unslung/wl500g/php-thttpd_2.25b-5. 2.0-4_mipsel.ipk
Nothing to be done
An error ocurred, return value: 1.
Collected errors:
ERROR: Cannot satisfy the following dependencies for php-thttpd:
libstdc++

簡單說明一下我的步驟,
1. 先將Firmware更新為1.9.2.7-7f
2. 分割好USB行動碟,容量512M,分割為P1:440M(屬性83)P2:60M(屬性82)
3. 安裝IPKG,也執行IPKG update,安裝nano,建立post-boot、post-firewall等檔案並變更屬性,編輯完後執行Flashfs系列指令
4. 完成SSH(重開後用SSH, admin登入連線無誤)
5. 建立使用者與群組,步驟無錯誤訊息,但使用pietty,SSH登入時,user1輸入密碼完即馬上關閉視窗,不知為何?
6. Samba設定依照要領完成,但reboot後約有一半機率會無法正常載入smbd和nmbd,即使用手動載入,一開始正常,約10-30秒後會只剩下nmbd(用PS看),再過5-10秒,連nmbd都會不見。

抱歉,我是問題寶寶,測試期間一直有不少問題,如果Abin大有空檔,再幫我把把脈。

另外一題,我的WL500g只要不開啟web管理程式的ftp功能,便完全無法看到USB碟,執行force EJECT後亦然,所以,Web功能的ftp是一直打開的,但利用PS指令看又找不到stupid-ftpd,很怪,以下列出剛登入後用PS指令看到的服務:
(none) login: admin
Password:
admin@(none)[/tmp/local/root]:ps
PID Uid VmSize Stat Command
1 admin 656 S /sbin/init
2 admin SW [keventd]
3 admin SWN [ksoftirqd_CPU0]
4 admin SW [kswapd]
5 admin SW [bdflush]
6 admin SW [kupdated]
7 admin SW [mtdblockd]
39 admin 292 S telnetd
44 admin 424 S httpd eth1
47 admin 324 S klogd
51 admin 352 S syslogd -m 0 -O /tmp/syslog.log -S -l 7
52 nobody 392 S dnsmasq
57 admin SW [khubd]
69 admin 340 S waveservermain
73 admin SW [usb-storage-0]
74 admin SW [scsi_eh_0]
85 admin 492 S pppd file /tmp/ppp/options.wan0
87 admin 432 S watchdog
89 admin 268 S ntp
96 admin SW [kjournald]
123 admin 412 S dropbear
133 admin 420 S upnp -D -L br0 -W ppp0
189 admin 540 S -sh
192 admin 408 R ps
admin@(none)[/tmp/local/root]:

4.

Abin 提到...

首先,你要先解決 libstdc++ 的問題。看來他要求你安裝新的 Standard C++ library,所以你要先裝 libstdc++ (ipkg install libstdc++),新版軟體常有類似的問題,這也是我寫文件時儘量標註軟體版本的原因,各函示的相依性往往會依版本而不同。(我很久沒試新版軟體了)
我發現,其實我用的是 FW 1.9.2.7-7e,Samba 也是內建,跑起來很穩定,作者應該有測試用過,你提的 Samba 問題我倒是沒碰過。(重點是,你有實際試過網路芳鄰,看看它到底能不能用呢?該 process 也有可能是連線進來的時候才會啟動..)
SSH 登入馬上會斷掉的狀況,我在 WL-500g 上沒碰過,不過我另一台 LinkStation (網路硬碟) 改機卻有發生,很頭大,原因還不清楚,初步懷疑是 Pietty 的問題(因為我從 WL-500g SSH 可以連進去,但從 PC 不行)
最後,你提到 FTP 和 USB 之間的關係,我也碰過一樣的狀況,我想可能是「Web 要開啟 FTP 功能,偵測 USB 儲存媒體的服務才會跑起來」,事實上 FTP 有沒有跑起來並不重要,重點是在能夠偵測到 USB 行動碟,Process 不存在不是正好嗎?

結論:看來我並不是什麼都用最新版的,有些狀況我並沒有發生過,當你進行安裝軟體的動作時,要確定每個該裝的元件是不是自動或手動安裝和更新完(像 libstdc++),還有安裝的過程和結果是否完全正確,這是我對兩個 HTTPD 安裝失敗的看法。如果還是不行,也可以換用 Oleg 前一版稍舊一點的 Firmware 試試看,最後版本雖然最新,但卻不一定是最穩定的。

Unknown 提到...

收到了,感謝Abin凌晨還撥空回覆。
我的WL-500G是放在家裡,之前是另外架了一部Windows Server當Web, ftp server,總覺得有點浪費,如果WL500G能夠使用,那就方便了!
目前計畫是:先改造我的WL500g,如果能當成簡易Web功能,就直接操作。如果負荷不了,就會再購入一部AP來用。
真需要如此的話,再請Abin兄建議適用的機器,到時會外接一部3.5"的USB碟。

Aven 提到...

感謝Abin兄的分享,這幾天小弟也在玩這個玩具,感覺thttpd的穩定性似乎不比lighttp+FCGI,速度也比較快,尤其是在16M RAM的機種上。
另外小弟想玩看看PunBB,並安裝SQLite,但一直裝不起來,PunBB install.php畫面顯示我沒有任何databae可用,是否可請Abin兄再弄個PunBB的設定分享,感謝。

Abin 提到...

aven, 我全系列介紹 Asus WL-500g 的文章的最後一篇有計畫要介紹我自己裝的所有軟體,裡面有包含 PunBB & SimplePHPBlog,不過我也忘了,PunBB 倒底有沒有成功裝起來過,我再確認一下,如果成功我再另文介紹~

Unknown 提到...

趁著228假期,把WL500g給更新了一下,照著ABin兄的步驟,一開始在uClibc (uClibc-opt 0.9.28-12)有小小問題,因為已經找不到該檔案,所以我用ipkg.sh install uClibc,安裝的是0.9.28-13版。

後面就很順利了,一直到裝完lighttpd和fastcgi,要執行/opt/etc/init.d/S45php start時,出現了下列訊息:
Cannot bind/listen socket - [125] Address already in use.
Couldn't create FastCGI listen socket on port 1026

移除再重頭來,試了3次都一樣,這下考倒我了,不曉的Abin兄有無建議?謝謝。

Unknown 提到...

作者已經移除這則留言。

Abin 提到...

To beast:

如果該服務上真的沒跑起來 (http & php,檢查 process)、實際功能也不能運作(檢查連線能不能建立、HTML & PHP 能不能動)、該用的 port 也都沒被佔用的話(列出所有使用中的 port),那會不會是 uClibc 用的函式庫與你裝的 lighttpd & FastCGI 有相容性的問題?
如果以上可能性都排除,說實話,我也不知道有什麼可以建議的了。

匿名 提到...

nano 編輯器怎麼這麼難用阿......
有沒有什麼教學之類的
我用到都快哭出來了
前面的改造頂多CMD打一打現在nano真的很難搞定
還要我去改這麼多東西.........
現在好懷念記事本喔

忘記問了
thttpd的首頁放在哪裡
我要把它換成自己的網頁

Abin 提到...

To host:
nano 已經比 vi 好用很多了,這還要教學?請自己 Google 吧~ Command line 的文字編輯器一向都是這樣。thttpd 的首頁位置請看這篇文章。

Andrew 提到...

想請問一下, 目前用NAS架相簿網站, 使用 lighttpd + fastcgi + mysql, 區域網路內, 一切正常. 但是連接至網際網路, 只有小照片OK, 較大照片顯示不完全. 也試過 debian + apache2 + mysql 結果一樣. 但是用Windows + apache2 + mysql OK. 不知道是哪裡的問題. 不曉的Abin兄有無建議?謝謝

Abin 提到...

To Vmebus:
聽起來像是(上傳)頻寬不足。如果你用的是 based on apache + php 之類的網路相簿程式,還有類似的問題,應該就不是軟體環境的狀況了。
一開始我考量儲存空間和使用頻寬的限制,所以從來沒考慮用自架的環境提供網路相簿的服務,這類服務沒辦法給你什麼建議。我是付費申請 flickr Pro,我有朋友本來也是自己搞,一樣是因為頻寬問題 (10M/2M),後來轉向 flickr,這種事還是交給專業的服務來做比較輕鬆。

匿名 提到...

想請問
我使用php-cli + lighttpd 可以看見php網頁
但是我將form資料以post或get方式提交, 卻無法執行

是否要改用fast-cgi或是cgi呢

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!