2007-01-22

支援 PHP 的網頁伺服器 (thttpd) 安裝設定

剛拿到 Asus WL-500g 的一定知道,它提供的是 Web 介面的設定方式,即使你用了 Oleg 的韌體,這個操作介面依然存在(還多了一些選項,只不過介面變英文的了)。言下之意是,不管怎樣韌體裡都一定有一個 Web Server (HTTP daemon)在跑,才能提供透過網頁介面來設定。可惜這個內建的 Web Server 相當陽春,而且是因為擔負著設定 Router 的重責大任,所以我們儘量不去動它,如果我們想拿這台 Router 來架一個可以對外服務的網站,而且最好還可以跑 PHP 網頁,那就要另外安裝一套囉!而且,在 Port 以及防火牆對外對內的設定也要調整,總不希望 Router 的設定介面會被人家從外面連進來 Config 吧!

這裡選擇的是 thttpd (Tiny/Turbo/Throttling HTTP server),因為的程式小、效能還不錯,而且還支援最新的 PHP5,安裝步驟也很簡單:

1. 安裝
在安裝程式之前,都要有個好習慣,就是先檢查軟體是不是有最新版:

/opt/bin/ipkg update

然後透過 ipkg 來安裝 thttpd (要花點時間下載、解壓縮和安裝):

/opt/bin/ipkg install php-thttpd

我裝的時候最新版是 2.25b,連帶它會下載安裝 PHP (5.1.6)、libxml2 (2.6.26)、libxslt (1.1.15)、 gdbm (1.8.3) 、libdb (4.2.52)、zlib (1.2.3),出現 "Successfully terminated" 就代表裝好了。(如果不行,確定網路可以連線,重新執行上面命令即可)

2. 設定
這個步驟分成兩個部分,第一個部分是你要指定你「網站」的目錄打算在哪裡,一併建立所需的目錄,第二個部分是 /opt/etc/thttpd.conf 設定檔內容。(兩部分是會有關係的)

2.1 建立目錄
網站目錄建議放在 USB 磁碟區裡 (/opt 下),假設我的網站目錄是在 /opt/public/www,手動建立:

mkdir /opt/public/
mkdir /opt/public/www

手動準備一個首頁檔 index.htm (測試使用,以後自己改掉):

echo "This is my test webspace!" > /opt/public/www/index.htm

檢查目錄 /opt/var 以及其子目錄 /opt/var/run, /opt/var/log 是否存在,這是用來存系統訊息和 log 的,不存在的話手動建立:

mkdir /opt/var
mkdir /opt/var/run
mkdir /opt/var/log

2.2 編輯設定檔
用 nano 去編輯修改設定檔 thttpd.conf:

/opt/bin/nano /opt/etc/thttpd.conf

加入或修改成以下內容:

dir=/opt/public/www
port=8080
user=nobody
nochroot
nosymlink
novhost
logfile=/opt/var/log/thttpd.log
pidfile=/opt/var/run/thttpd.pid

第一行是指定你網站的根目錄,而第二行是指定你 thttpd 要使用的 port,千萬不能改成 80,因為 80 已經被上述的「系統預設」網站程式給佔用,這裡如果設成 80 一定會出事的!所以我先用 Port 8080,當外面要連進來的時候透過防火牆將連線轉過來就好。設定好後存檔離開。

3. 防火牆設定
每次動到防火牆就是要動到 /usr/local/sbin/post-firewall 這個檔案。用 nano 開啟它,加入下面的設定內容。如果你有設定過 SSH,下面這段請加在 SSH 那一段之後,在最後一行之前:

# Port 8080 used for internal THTTP server, port 80 used for external access
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080

如果你沒有設定過 SSH,而且該檔案內容空白,請加下面完整的內容:

#!/bin/sh
iptables -D INPUT -j DROP

# Port 8080 used for internal THTTP server, port 80 used for external access
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080

iptables -A INPUT -j DROP

記得 flush 到 flash 裡再重新開機:

flashfs save
flashfs commit
flashfs enable
reboot

4. 測試
完成以上步驟後,Router 裡面應該跑了兩個 Web Server (可以用 ps 命令查一下),如果在家裡(內部區域網路,線路直接連接在 Router 後面),打開瀏覽器直接連會跑出預設 WL-500g 的設定頁面,如果在家裡要連剛裝好 thttpd 服務的網站,由於對內設定為 port 8080,所以要在 ip 或網址後面加上 :8080,假設你的 WL-500g IP 是 192.168.1.1,那麼新網站就會是 http://192.168.1.1:8080。如果你從外面連,由於對外我們是使用 port 80(防火牆將外面連進 Port 80 的連線都轉到內部的 Port 8080),所以直接使用固定 IP 或你申請的網域名稱應該就可以連了。剛剛我們放的測試首頁裡只有一行,所以如果正常的話,應該只會看到一行 "This is my test webspace!" 才是。

如果你想測試 PHP 取得各個版本和支援的資訊,可以再建立一個檔案:

echo "<?php phpinfo(); ?>" > /opt/public/www/index.php

這個檔案裡面是 PHP 的程式碼,如果 Web Server 正常執行,那麼除了會有完整的 PHP 相關訊息,也會有版本資料提供參考。

如果怎麼連都連不上,請確定該程式有在執行中(可以用 ps 指令,檢查有沒有 /opt/sbin/thttpd -C /opt/etc/thttpd.conf 這個執行緒在)。如果沒在執行,也可以手動啟動該服務,只要執行下面命令該服務也會跑起來:

/opt/etc/init.d/S80thttpd start

同樣的,如果你後面 start 的參數改成 stop 或是 restart,也可以對正在執行的 thttpd 做停止和重新啟動的操作。

參考文章:
thttpd Web Server

備註:
我比較喜歡像 thttpd 這種 Web Server + PHP 的服務,但是我自己用的感覺一直都不穩,偶爾 Daemon 莫名其妙就死掉消失,網路上有類似反應的人好像還不少。如果裝完 thttpd 而且實際上也不大穩的話,也可以換別套使用。(下一篇介紹改用的是 lighttpd + FastCGI,兩個裝在一起也能同時提供 Web + PHP 的服務)

回應: 1

匿名 提到...

請問一下,我在安裝完thttpd之後,reboot完,再準備要啟動S80thttpd這個程式,為什麼它寫/opt/etc/init.d/S80thttpd: Input/output error??
這個問題該如何解決??

張貼留言

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