為什麼要在Mac機器上裝Linux? 是Mac OS X不好用嗎? 這倒不是, 我本來有一台x86機器是用來當作測試機, 裝了Debian 3.1, 但是RAM太少, 128MB吃得滿滿, 機器上跑了httpd, php, ftpd與sshd...老是掛點, 我曾想過增加RAM, 不過老機器用的SDRAM很不好找, 在二手市場區的SDRAM也是一出來就被人搶光, 而我的Mac mini已退為娛樂用機, 但是配備比我一堆x86機器好多了, 而且裝了1G RAM, 於是就乾脆換上大容量硬碟, 同時讓Mac OS X與Debian Linux共存, 讓這台Mac mini能在工作與娛樂間充分發揮功能與利用殘存價值。

既然多了Mac mini, 正好與先前裝好Debian Linux的x86機器搭配, 我計劃在x86上跑httpd, 而Mac mini就專跑php。接下來的軟硬體安裝, 先由換硬碟開始吧。我採用網路線法來拆Mac mini的外殼, 要用些耐心穿線, 拆下外殼後, 將光碟機與硬碟機支架整個卸下, 要拆硬碟還得把CPU散熱風扇先拆除, 才能看到隱藏的硬碟固定螺絲。


小心將硬碟從插座上推出, 一旁是買很久的Toshiba 80GB硬碟, 不過效能沒有Mac mini裡的Seagate硬碟好。


連硬碟標籤也有蘋果...


接著把Toshiba 80GB硬碟裝上。


再將整個模組裝上主機板, 在完成測試前, 我就這樣放著, 不然有問題還得在費功夫拆外殼。

我先裝上Mac OS X, 80GB的硬碟空間分割60GB給它用, 剩餘的20G保留且不設定檔案格式, 稍後裝Debian 3.1時做就好了。花了幾十分鐘, 裝好OS X, 重新開機進入桌面, 確定無誤後, 把Debian光碟放入光碟機後重新開機, 按住鍵盤"C"鍵由光碟開機, 跟以往我只裝過x86版debian不太一樣, 會先進入yaboot, 它是個Boot Loader, 要雙開機系統就靠它囉, 在yaboot的提示符號輸入"install"開始安裝Debian Linux。

Debian Linux還不錯, 自朋友推薦它後, 我就常利用這套Linux, 有許多預先包好的軟體套件, 像是RedHat Linux的rpm, 執行安裝命令就能從光碟、網站或是FTP站抓取套件。


在磁碟分割區設定, 選取剩餘的空間, 最簡單的方式就是讓Debian幫你規劃好。

接著依照指引安裝就好, 沒有GUI的安裝程式雖然比RedHat遜色些, 不過還算容易, 參考網路上的文件, 照著指引就能裝好Debian, 機器環境我都沒有選取, 我決定自行安裝我要的軟體。


重新啟動後, 可以選擇要啟動的作業系統, 或是由光碟機啟動。


進入Debian, 在yaboot稍等一下就會自動載入。


開始啟動Debian Linux。

完成初步安裝後, 我先來調整一些系統參數, 讓系統效能盡量發揮...這些資料是朋友提供的, 在Linux或FreeBSD都可以用, 在逐個測試後, 我留下在Debian能用的參數。

先轉為系統最大權限的"root", 系統會詢問密碼:
su

編輯系統控制設定檔, 我習慣用"nano"這個簡單的編輯器:
nano /etc/sysctl.conf

將參數貼進設定檔, 並且儲存:
fs.file-max = 8192000
kernel.shmall = 134217728
kernel.shmmax = 134217728
net.core.rmem_max = 1048576
net.core.wmem_max = 1048576
net.core.rmem_default = 262143
net.core.wmem_default = 262143
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_rmem = 4096 87380 524288
net.ipv4.tcp_wmem = 4096 65536 524288
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.neigh.default.gc_thresh3 = 20480
net.ipv4.neigh.default.gc_thresh2 = 15360
net.ipv4.neigh.default.gc_thresh1 = 10240
net.unix.max_dgram_qlen = 512
vm.overcommit_memory = 2

喔...差點忘了把網路卡的IP改為固定, 正好辦公室網路上有DHCP server, 安裝Debian時自動抓取了IP, 先改好免得IP跳動以後麻煩:
nano /etc/network/interfaces

編輯eth0(第一張網路卡)的設定, 請參考就好:
iface eth0 inet static
address 192.168.11.249
netmask 255.255.255.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 168.95.1.1

把網卡重新啟動:
ifdown eth0; ifup eth0

重新載入剛才變更的系統設定:
sysctl -p /etc/sysctl.conf


前面提到httpd(網站伺服器)與php(一種伺服器端描述語言)我拆成兩台機器來跑, 這得靠FastCGI以用TCP/IP的區域網路內處理網頁動態資料並傳回httpd, FastCGI改善了以往CGI效能不彰的困境, 各大httpd也都能支援FastCGI, 像是佔有率最高的Apache及微軟的IIS。httpd我採用輕量級的lighttpd, 佔用資源少, 效能也不錯, 也是友人推薦使用, 與Apache同般有多種模組, 讓受不了Apache癡肥的人可以輕鬆轉移到lighttpd。


我的實驗環境架構, PC(192.168.11.250)與Mac mini(192.168.11.249)都裝好了。

先在PC端架好lighttpd, 到官網抓原始檔回來:
cd /usr/local/src
wget http://www.lighttpd.net/download/lighttpd-1.4.9.tar.gz

解開壓縮檔, 開始安裝lighttpd:
tar zxvf lighttpd-1.4.9.tar.gz
cd lighttpd-1.4.9
./configure

完成configure後, 無誤就開始編譯與安裝:
make
make install

把預設lighttpd組態檔複製出來:
mkdir /etc/lighttpd
cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf

做好error.log與access.log:
mkdir /var/log/lighttpd
cd /var/log/loghttpd
touch error.log
touch access.log

OK! 接著修改lighttpd.conf:
nano /etc/lighttpd/lighttpd.conf

將"mod_fastcgi"前的井字號刪掉, 也就是該設定值有效:
server.modules

設定網頁檔案的絕對路徑, 因為分離了httpd與php, 所以這台機器上至少要有網站的靜態檔案, 例如: html檔, gif, jpg...等圖檔, 因為這些檔案是不需要php去處理的。
server.document-root = "/home/www/"

修改error.log的路徑:
server.errorlog = "/var/log/lighttpd/error.log"

修改acccess.log的路徑:
accesslog.filename = "/var/log/lighttpd/access.log"

設定網站的服務監聽埠:
server.port = 80

設定HTTP錯誤404(找不到檔案)的處理程式, 顯示html檔也行, 不設也可以:
server.error-handler-404 = "/error.php"

到"fastcgi module"設定區, 把Mac mini的php服務設定貼上, 不過還沒安裝, 所以不急著啟動lighttpd喔!
fastcgi.server = ( ".php" =>
  ( "macnini" =>
    (
        "host" => "192.168.11.249",
        "port" => 1026,
        "mode" => "responder",
        "check-local" => "disable"
     )
   )
)

回到Mac mini, 開始安裝PHP吧, 先取得PHP的原始碼:
cd /usr/local/src
wget http://tw.php.net/get/php-5.1.2.tar.gz/from/this/mirror


抓了PHP 5.1.2, 不過我慣用的PHP加速器eAccelerator還不支援, 不過這些機器只供我使用, 所以還沒關係, 可以等eAccelerator新版出來。

解壓縮PHP的原始檔:
tar zxvf php-5.1.2.tar.gz
cd php-5.1.2

設定組態, 如果你還需要其他功能, 這時就得把參數加入, 不然以後還得重編:
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/conf --enable-fastcgi --with-layout=PHP --disable-ipv6 --with-zlib --with-mysql

編譯與安裝PHP, 無誤的話就會裝到/usr/local/php:
make
make install

接著建立PHP的設定檔目錄, 並把預設檔案複製進去:
mkdir /usr/local/php/conf
cp php.ini-dist /usr/local/php/conf/php.ini

請依照你的喜好修改php.ini吧:
nano /usr/local/php/conf/php.ini

確定一下PHP是不是裝好:
cd /usr/local/php/bin
./php -v

如果顯示就正常囉:
PHP 5.1.2 (cgi-fcgi) (built: Jan 13 2006 10:16:03)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

不過要讓PHP FastCGI服務跑起來, 我們還需要lighttpd的作者寫的"spawn-fcgi"程式, 如果沒有被自動安裝, 請下載spawn-fcgi並編譯安裝它, 把spawn-php.sh這個Shell Script抓回來利用:
cd
wget http://www.lighttpd.net/download/spawn-php.sh
chmod 755 spawn-php.sh

修改spawn-php.sh的設置:
nano spawn-php.sh

首先確定程式路徑正確:
SPAWNFCGI="/usr/local/sbin/spawn-fcgi"

PHP的執行檔目錄與檔名:
FCGIPROGRAM="/usr/local/php/bin/php"

允許連入的伺服器IP位址:
FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.11.250"

儲存好spawn-php.sh, 啟動PHP的FastCGI服務吧:
./spawn-php.sh

有回應啟動成功訊息就是正常囉:
spawn-fcgi.c.150: child spawned successfully: PID: 6125

可以用top指令來看:

PHP網頁檔案在這台機器也需要有一份, 放在與網站伺服器相同目錄。

這時可以啟動網站伺服器了, 回到PC端, 把lighttpd啟動:
/usr/local/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf


後續還有資料庫的安裝, 這個就讓各位自己玩, 我的PHP FastCGI與lighttpd的安裝筆記就到此結束囉。