php 與 apache 最常協同工作的方式是採用在 apache 上掛載 mod_php 模組,在執行 apache 的時候呼叫這個模組來編譯 php 網頁。所以接收工作與回應的模式大都是 apache 在控制(這邊指的是行程的數量…與生命週期等等),預設情況 apache 會有一個 process pool 接到要求就從 pool 中叫一個起來工作,如果工作超過 pool 的 process 量的話則 fork 新 process 來處理,則會佔用大量的記憶體,尤其是 apache 是採用 process 不是 thread 的關係(一個 30M 200個 request 就需要 6G)。
common gateway interface 是一個讓網頁伺服器與程式銜接的介面,叫做 interface 就是代表各種語言只要實做了這個介面就能跟網頁伺服器溝通。而 fast cgi 則是 cgi 的擴展擁有許多更良好的特性,可以是一個不中斷程式持續的接收工作,而 apache 接到工作以後不是採用 php 模組的方式呼叫編譯,而是將要求轉送至已在運行的 fcgi 程式中。
透過 fast cgi 的方式運作與 spawn cgi 來管控數個設定如: php_cgi 行程的數量。透過管理 php_cgi 行程池,減低 apache 載入 php 模組所耗費的記憶體,應能加速 apache fork 行程的速度,因為少載入了一個肥大的 mod_php module。這樣的話假設實際環境使用者要求個網頁有 1個php 9個資源的情況,10個要求只有1個需要呼叫 php_cgi ,這樣 10 個 php_cgi 可以處理 100 個 apache process。
PHP-CGI 模組:
在用 src 安裝 php 的時候,通常會選擇順便編譯成 apache 的 module
$ ./configure --with-apxs2=/usr/sbin/apxs $ make $ make install
這樣應可以編譯出 mod_php 來,但是如果要編譯成 cgi or fast-cgi ( php-cgi ) 則不可以加入這個參數,
如果加入了這個參數就會只編譯出 mod_php..或許 php 覺得要跑網站只要一種方式就夠了吧!
可以從安裝完成的訊息中看出有沒有編譯成 cgi
Installing PHP SAPI module: cgi
Installing PHP CGI binary: /usr/bin/
Installing PHP CLI binary: /usr/bin/
Installing build environment: /usr/lib/build/
Installing header files: /usr/include/php/
Apache 模組:
接著安裝 apache 的 mod_fastcgi ,http://www.fastcgi.com/dist/
下載下來以後 複製 Makefile.AP2 成 Makefile 代表你要編的是 apache2 的模組…,
然後就能
make TOP_DIR=/usr/lib[64]/httpd/;make install
要指定 top_dir 到 apache 的安裝目錄,才能順利編譯跟安裝,
安裝好以後就能加入 apache 裡面囉~
loadModule fastcgi_module modules/mod_fastcgi.so
然後看自己的 spawn_cgi or fastcgi process manager 跑在哪個 port or sock 上面,例如 127.0.0.1:9000,
就要設定怎麼跟 apache 銜接囉。
例如:
<VirtualHost *:80> ServerName mlwmlw.org DocumentRoot /home/sysadm/www/ # 副檔名是 .php 的都加上 php5-fastcgi 這個標籤 AddHandler php5-fastcgi .php # 將 http://mlwmlw.org/cgi-bin 這個目錄下的檔案都導到 /home/sysadm/www ScriptAlias /cgi-bin "/home/sysadm/www/" # 建立一個虛擬的檔案作為 fastcgi 轉譯的入口,都指向 spawn-cgi 的 port FastCgiExternalServer /home/sysadm/www/index.fcgi -host 127.0.0.1:9000 # 將帶有 php5-fastcgi 這個標籤的要求 都導向至 http://mlwmlw.org/index.fcgi 上 Action php5-fastcgi "/cgi-bin/index.fcgi" </VirtualHost>
這個整個過程有點複雜…,我搞好久才搞的能動,也還沒有很懂為啥要這樣設,可以參考 相關資源最後兩個,裡面有一些範例可以參考……
目前理解的概念是要設一個 fastcgi 的編譯入口檔案,然後將 php 的要求都轉至該節點,就好像有一個函式要將 php 檔案當成參數丟過去就會回傳直譯後的結果的感覺吧!
相關資源:
- spawn-cgi with apache http://www.ha97.com/173.html
- apache fastcgi configuration http://www.cyberciti.biz/tips/rhel-centos-fedora-apache2-fastcgi-php-configuration.html
- lighttpd 和 apache比較 http://www.yuanma.org/data/2009/0103/article_3470.htm
- using spawn_fcgi benefits http://serverfault.com/questions/6733/php-what-are-the-advantages-of-fastcgi-over-mod-php
- apache22 (worker) + mod_fastcgi + php5-fcgi http://blog.gslin.org/archives/2008/08/17/1624/
- apache安裝fastcgi(php-fpm) http://hi.baidu.com/171892549/blog/item/1d3801d70f03c6d7a144df4f.html
- apache 基本配置 實例 http://www.jnavy.com/211
延生議題:
關於這些調校問題還有幾個東西能深入研究 apache apc, apache mpm worker