1 實戰Nginx與PHP(FastCGI)的安裝、配置與優化php
1.1 什麼是 FastCGI前端
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。c++
FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能不好,由於每次HTTP服務器遇到動態程序時都須要從新啓動腳本解析器來執行解析,而後將結果返回給HTTP服務器。這在處理高併發訪問時幾乎是不可用的。另外傳統的CGI接口方式安全性也不好,如今已經不多使用了。瀏覽器
FastCGI接口方式採用C/S結構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。安全
1.2 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-3所示。併發
1.3 spawn-fcgi與PHP-FPMapp
前面介紹過,FastCGI接口方式在腳本解析服務器上啓動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱爲FastCGI引擎。 spawn-fcgi與PHP-FPM就是支持PHP的兩個FastCGI進程管理器。socket
下面簡單介紹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內核中,所以在處理性能方面更加優秀。同時PHP-FPM在處理高併發方面也比spawn-fcgi引擎好不少,所以,推薦使用Nginx+PHP/PHP-FPM這個組合對PHP進行解析。
FastCGI 的主要優勢是把動態語言和HTTP Server分離開來,因此Nginx與PHP/PHP-FPM常常被部署在不一樣的服務器上,以分擔前端Nginx服務器的壓力,使Nginx專注處理靜態請求和轉發動態請求,而PHP/PHP-FPM服務器專注解析PHP動態請求。
1.4 PHP與PHP-FPM的安裝及優化(1)
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須要下面軟件包的支持,若是沒有安裝,請自行安裝。
因爲各個Linux系統版本有不肯定性,讀者也能夠在安裝PHP過程當中,根據錯誤提示信息,安裝對應的軟件庫。
3.開始編譯安裝PHP和PHP-FPM
編譯安裝PHP和PHP-FPM很簡單,下面是安裝過程:
其中,第二步將PHP-FPM做爲補丁加入PHP源碼中。
在「./configure」編譯選項中,指定將PHP安裝到/usr/local下;「--enable-fastcgi」是啓用對PHP的FastCGI支持;「--enable-fpm」是激活對FastCGI模式的fpm支持。
在編譯PHP時能夠加入不少編譯選項,可是這裏爲了介紹PHP的FastCGI功能沒有加入更多的編譯選項。
4.配置與優化PHP-FPM
PHP的全局配置文件是php.ini,在上面的步驟中,已經將此文件複製到了/usr/local/php/lib/php.ini下。能夠根據每一個應用需求的不一樣,對php.ini進行相應的配置。
下面重點介紹PHP-FPM引擎的配置文件。
根據上面指定的安裝路徑,PHP-FPM的默認配置文件爲/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一個XML格式的純文本文件,其內容很容易看明白。這裏重點介紹幾個重要的配置標籤。
標籤listen_address是配置FastCGI進程監聽的IP地址以及端口,默認是127.0.0.1:9000。
標籤display_errors用來設置是否顯示PHP錯誤信息,默認是0,不顯示錯誤信息,設置爲1能夠顯示PHP錯誤信息。
標籤user和group用於設置運行FastCGI進程的用戶和用戶組。須要注意的是,這裏指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。
標籤max_children用於設置FastCGI的進程數。根據官方建議,小於2GB內存的服務器,能夠只開啓64個進程,4GB以上內存的服務器能夠開啓200個進程。
標籤request_terminate_timeout用於設置FastCGI執行腳本的時間。默認是0秒,也就是無限地執行下去,能夠根據狀況對其進行修改。