2007/01/01

Linux 上編譯 PHP 及 XCache, 安裝 Ruby FastCGI

新年快樂。

最近為了 Pixmicat! 新版準備釋出在進行除錯測試工作,一切正常。
但正常的部分也只能保證 PIO Log, MySQL 和 FileIO normal 而已,因為是有真正投入運作的。
上次在開發相關討論 Yuka 君提到了 SQLite 有問題,我趕緊進行測試,
使用三種機器進行測試:

Microsoft Windows XP Home Edition SP2
Abyss Web Server X1/2.3.2
PHP 5.2.0 FastCGI (SQLite 2.8.17)

Fedora Core 5 (2.6.18-1.2239.fc5)
lighttpd/1.4.13
PHP 5.1.6 FastCGI (SQLite 2.8.17) + eAccelerator 0.9.5

FreeBSD 6.2-PRERELEASE
lighttpd/1.4.13
PHP 5.2.0 FastCGI (SQLite 2.8.17)


當然都沒問題,信心十足地回報這應該是 SQLite 太舊的問題。
因為我以前剛開發 PIO SQLite 版時也遇過類似的情況,在 chkkk.idv.tw 怎麼測都有問題,
後來去重編譯新版 PHP 就沒事了。

剛好我的 FC5 已經沒碰一段時日,程式也稍舊了,因為這台不是上線工作機,
自然可以嘗鮮使用新軟體,我滿喜歡當白老鼠的 XD 於是趁這期間重編譯一下 PHP。
怎知道原始碼弄下來了 (from PHP Snapshot),解開要進行 ./configure 時一直提示:

installation or configuration problem: C++ compiler cannot create executables

這種訊息。奇怪那我之前 PHP 5.1.6 是怎樣編譯成功的?於是受不了開了 yum 小黃狗,
更新系統套件,竟然多達 249 種套件要更新,我知道 FC6 已經出了,我也有一份,
但是要升級很麻煩,所以就沒做。後來也順便 yum install gcc* 一下,不知怎的就解決了。

# wget http://snaps.php.net/php5.2-200612310530.tar.bz2
# tar xjvf php5.2-200612310530.tar.bz2
# cd php5.2*
# ./configure (略)
# make
# make install


當然不是取代原有 PHP 5.1.6,我放在 /usr/local/bin/php-5.2.0 下。

而後拿 PHP 5.1.6 時的 php.ini 來用,發現 eAccrelerator 0.9.5 不能用了,
因為 Zend Extension 版本號變了就不能用,真麻煩。因為不知道他還能不能用在 5.2.1-dev,
乾脆試另一個聽說是後起之秀的 XCache。

XCache 官方網站:http://xcache.lighttpd.org
可以看出來他跟 lighttpd 應該有合作的關係,說實在的我也很看好 lighttpd 的發展,
Apache 雖然市占率還是很高,功能也真的強。不過我偏愛輕巧的 lighttpd + FastCGI運作。

# wget http://210.51.190.228/pub/XCache/Releases/xcache-1.2.0.tar.bz2
# tar xjvf xcache-1.2.0.tar.bz2
# cd xcache


看起來都很順利,不過 XCache 不是直接用 ./configure 方式來設定,
它還需要 PHP-devel 套件的 phpize 和 php-config 來進行設定。
因故,我必須下其他方式的指令:

# /usr/local/bin/php-5.2.0/bin/phpize
# ./configure --enable-xcache --with-php-config=/usr/local/bin/php-5.2.0/bin/php-config
# make
# make install


如果您不知道自己的 phpize, php-config 位於何處,可以下 locate phpize 指令來尋找。
安裝後它會將編譯完成的 xcache.so 放到 /usr/local/bin/php-5.2.0/lib/php/extensions/no-debug-non-zts-XXXXXXXX/ 下。
很長的目錄,當 make install 成功時應該會有提示放在哪裡。

最後將 XCache 設定加進 php.ini,使 PHP 可以使用此套件:

# cat xcache.ini >> /usr/local/bin/php-5.2.0/config/php.ini
# vi /usr/local/bin/php-5.2.0/config/php.ini


記得修改成自己的 php.ini 的位置,然後修改設定檔。

[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/local/bin/php-5.2.0/lib/php/extensions/no-debug-non-zts-20060613/xcache.so

[xcache.admin]
xcache.admin.user = "test"
xcache.admin.pass = "098f6bcd4621d373cade4e832627b4f6"


上部分的 zend_extension 參照上面 make install 得知的路徑填入以引入套件,
下面部分是 XCache 網頁管理介面的權限設定,自己改成喜歡的吧。
注意到 pass 填入的是 MD5,也就是你得先將密碼編碼,可用 http://md5-online.de 來編碼。

然後是 XCache 使用的記憶體量,預設是 0 (Off),當然要打開,大小隨你高興:

[xcache]
xcache.size = 64M


最後記得將解壓的 xcache 內的 admin 資料夾搬到網頁目錄,這個是 XCache 的管理介面。
還有,檢查是否真的掛載成功:

# cp -R admin /srv/www/xcache-admin
# /usr/local/bin/php-5.2.0/bin/php -v
PHP 5.2.1RC2-dev (cgi-fcgi) (built: Jan  1 2007 00:02:36)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
with XCache v1.2.0, Copyright (c) 2005-2006, by mOo


順便試看看 XCache 網頁管理介面:http://127.0.0.1/xcache-admin/
輸入帳號密碼後就可以看到 XCache 是否作用及相關參數。

You make it! 現在也可以享受 lighttpd + PHP FastCGI + XCache 的快感了。

最後提到 Ruby,因為篇幅不夠就直接用 yum 安裝吧 XD

# yum install ruby*


記得裝 ruby-libs, ruby-irb, ruby-devel!

而後安裝 FastCGI, ruby-fcgi, mmap 套件 (因為我想用 ruby-cgi 來跑 FastCGI):

FastCGI: http://www.fastcgi.com/dist/fcgi.tar.gz
fcgi: http://raa.ruby-lang.org/project/fcgi
mmap: http://raa.ruby-lang.org/project/mmap

FastCGI:
# ./configure
# make
# make install

fcgi:
# ruby install.rb config
# ruby install.rb setup
# ruby install.rb install

mmap :
# ruby extconf.rb
# make
# make install


最後進 irb 試看看 fcgi, mmap 是否可用:

irb(main):001:0> require "fcgi"
=> true
irb(main):002:0> require "mmap"
=> true


終於到最後一步了,抓取 ruby-cgi 檔案:http://pallas.telperion.info/ruby-cgi/
這個網站裡面有 ruby-cgi 這個 FastCGI Wrapper (Spawn)
放到/usr/bin 下面,並 chmod 755 ruby-cgi

最後一步了!修改 lighttpd 設定檔:

# vi /usr/local/bin/lighttpd/config/lighttpd.conf

fastcgi.server = (".php" =>
("localhost" =>
(
"socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/local/bin/php-5.2.0/bin/php",
"broken-scriptfilename" => "enable"
)
),
".rhtm" =>
("localhost" =>
("socket" => "/tmp/ruby-fastcgi.socket",
"bin-path" => "/usr/bin/ruby-cgi"
)
)
)


上面的範例是追加 .rhtm 給 /usr/bin/ruby-cgi 代跑,重新啟動伺服器看看。
如果啟動沒什麼問題,那就是成功了。可以試看看 ps -ef | grep lighttpd 有什麼。
應該可以看到有數個 /usr/bin/ruby /usr/bin/ruby-cgi 常駐,這樣就成功了。

試驗看看:

hello.rhtm

puts "Content-Type: text/plain\n\n"

a = [53,57,368,25678,256,1234,78,3,567,4,57]
p a
p a.sort
p a.reverse


注意到不必加 #!/usr/bin/env ruby 和設 chmod 755 也能跑,
速度也比較快(雖然可能沒啥感覺 囧)

可以用 ab (Apache Benchmark) 來測:

# ab -c 10 -n 10 http://127.0.0.1/hello.rhtm


多測幾次可以發現跟 PHP FastCGI 差不多快啦。
---
好長的新春文章 囧
記錄一下編譯的心得讓後人可以參考吧。

3 則留言:

  1. eAccelerator 0.9.5應該能在5.2x中用的...
    反正就是phpize + make就是了w

    回覆刪除
  2. 現在滿看好 XCache 的發展,雖然他的 Optimizer 好像還沒完成。
    而 eAccelerator 曾經停滯一段時間,而且官方不 Win32 Binaries,這使得門檻提高。
    我會在 Linux 使用 gcc 編譯,跑到 Windows 倒不知道得用啥了。
    還好還有人釋出編譯檔,但也很難找。 (Siokara還有w)

    回覆刪除
  3. eAccelerator 獨有的cache to disk功能不見得其他功能類似的軟件有呢...

    回覆刪除