一、什麼是 FastCGI
FastCGI是一個可伸縮地、高速地在HTTP server和動態指令碼語言間通訊的介面。多數流行的HTTP server都支援FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多指令碼語言所支援,其中就有PHP。 FastCGI是從CGI發展改進而來的。傳統CGI介面方式的主要缺點是效能很差,因為每次HTTP伺服器遇到動態程式時都需要重新啟動指令碼解析器來執行解析,然後結果被返回給HTTP伺服器。這在處理高並發訪問時,幾乎是停用。另外傳統的CGI介面方式安全性也很差,現在已經很少被使用了。 FastCGI介面方式採用C/S結構,可以將HTTP伺服器和指令碼解析伺服器分開,同時在指令碼解析伺服器上啟動一個或者多個指令碼解析守護進程。當HTTP伺服器每次遇到動態程式時,可以將其直接交付給FastCGI進程來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態指令碼伺服器的結果返回給用戶端,這在很大程度上提高了整個應用系統的效能。
二、Nginx+FastCGI運行原理 Nginx不支援對外部程式的直接調用或者解析,所有的外部程式(包括PHP)必須通過FastCGI介面來調用。FastCGI介面在Linux下是socket,(這個socket可以是檔案socket,也可以是ip socket)。為了調用CGI程式,還需要一個FastCGI的wrapper(wrapper可以理解為用於啟動另一個程式的程式),這個wrapper綁定在某個固定socket上,如連接埠或者檔案socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI介面,wrapper接納到請求,然後派生出一個新的線程,這個線程調用解譯器或者外部程式處理指令碼並讀取返回資料;接著,wrapper再將返回的資料通過FastCGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的資料發送給用戶端,這就是Nginx+FastCGI的整個運作過程。詳細的過程,如圖1所示。
圖1 Nginx+FastCGI運行原理
三、spawn-fcgi與PHP-FPM
前面介紹過,FastCGI介面方式在指令碼解析伺服器上啟動一個或者多個守護進程對動態指令碼進行解析,這些進程就是FastCGI進程管理器,或者稱之為FastCGI引擎, spawn-fcgi與PHP-FPM就是支援PHP的兩個FastCGI進程管理器。下面簡單介紹spawn-fcgi與PHP-FPM的異同。
spawn-fcgi是HTTP伺服器lighttpd的一部分,目前已經獨立成為一個項目,一般與lighttpd配合使用來支援PHP,但是ligttpd的spwan-fcgi在高並發訪問的時候,會出現記憶體流失甚至自動重啟FastCGI的問題。
Nginx是個輕量級的HTTP server,必須藉助第三方的FastCGI處理器才可以對PHP進行解析,因此Nginx+spawn-fcgi的組合也可以實現對PHP的解析,這裡不過多講述。
PHP-FPM也是一個第三方的FastCGI進程管理器,它是作為PHP的一個補丁來開發的,在安裝的時候也需要和PHP源碼一起編譯,也就是說PHP-FPM被編譯到PHP核心中,因此在處理效能方面更加優秀;同時它在處理高並發方面也比spawn-fcgi引擎好很多,因此,推薦Nginx+PHP/PHP-FPM這個組合對PHP進行解析。
FastCGI 的主要優點是把動態語言和HTTP Server分離開來,所以Nginx與PHP/PHP-FPM經常被部署在不同的伺服器上,以分擔前端Nginx伺服器的壓力,使Nginx專一處理靜態請求和轉寄動態請求,而PHP/PHP-FPM伺服器專一解析PHP動態請求。
四、 PHP與PHP-FPM的安裝及最佳化
1.下載安裝包從www.php.net官方網站下載PHP源碼包,這裡下載的是穩定版php-5.2.13.tar.gz。從http://php-fpm.org/downloads/下載對應的PHP-FPM源碼包,這裡下載的是php-5.2.13-fpm-0.5.13.diff.gz。需要注意,在下載軟體包版本時,盡量使PHP和PHP-FPM版本一致,如果版本之間相差太大,可以會出現相容問題。
2.配置安裝環境安裝PHP需要下面軟體包的支援,如果沒有安裝,請自行安裝。
gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
由於各個Linux系統版本的不確定性,讀者也可以在安裝PHP過程中,根據錯誤提示資訊,安裝對應的軟體庫。