萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 實戰Nginx與PHP(FastCGI)的安裝、配置與優化

實戰Nginx與PHP(FastCGI)的安裝、配置與優化

 一、什麼是 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所示。
 
 

實戰Nginx與PHP(FastCGI)的安裝、配置與優化 三聯

圖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需要下面軟件包的支持,如果沒有安裝,請自行安裝。

 
  1. 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過程中,根據錯誤提示信息,安裝對應的軟件庫。

3.開始編譯安裝PHP和PHP-FPM 編譯安裝PHP和PHP-FPM很簡單,下面是安裝過程:

 

[root@localhost local]#tar zxvf php-5.2.13.tar.gz  

[root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1  

[root@localhost local]#cd php-5.2.13  

[root@localhost php-5.2.13]#./configure  --prefix=/usr/local/php --enable-fastcgi --enable-fpm  

[root@localhost php-5.2.13]#make  

[root@localhost php-5.2.13]#make install  

[root@localhost php-5.2.13]cp php.ini-dist /usr/local/php/lib/php.ini  

其中,第二步將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。 <value name="listen_address">127.0.0.1:9000</value>

標簽display_errors用來設置是否顯示PHP錯誤信息,默認是0,不顯示錯誤信息,設置為1可以顯示PHP錯誤信息。 <value name="display_errors">0</value>

標簽user和group用於設置運行FastCGI進程的用戶和用戶組。需要注意的是,這裡指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。 <value name="user">nobody</value> <value name="group">nobody</value>

標簽max_children用於設置FastCGI的進程數。根據官方建議,小於2GB內存的服務器,可以只開啟64個進程,4GB以上內存的服務器可以開啟200個進程。 <value name="max_children">5</value>

標簽request_terminate_timeout用於設置FastCGI執行腳本的時間。默認是0s,也就是無限執行下去,可以根據情況對其進行修改。 <value name="request_terminate_timeout">0s</value>

標簽rlimit_files用於設置PHP-FPM對打開文件描述符的限制,默認值為1024。這個標簽的值必須和Linux內核打開文件數關聯起來,例如要將此值設置為65535,就必須在Linux命令行執行'ulimit -HSn 65536'。 <value name="rlimit_files">1024</value>

標簽max_requests指明了每個children最多處理多少個請求後便會被關閉,默認的設置是500。 <value name="max_requests">500</value>

標簽allowed_clients用於設置允許訪問FastCGI進程解析器的IP地址。如果不在這裡指定IP地址,Nginx轉發過來的PHP解析請求將無法被接受。 <value name="allowed_clients">127.0.0.1</value>

5.管理FastCGI進程在配置完php-fpm後,就可以啟動FastCGI進程了。啟動fastcgi進程有兩種方式:

 

/usr/local/php/bin/php-cgi --fpm   

或者  

/usr/local/php/sbin/php-fpm  start  

建議采用第二種方式啟動FastCGI進程。  /usr/local/php/sbin/php-fpm還有其他參數,具體為start|stop|quit|restart|reload|logrotate。每個啟動參數的含義如下:

 

 start,啟動PHP的FastCGI進程。  

 stop,強制終止PHP的FastCGI進程。  

quit,平滑終止PHP的FastCGI進程。  

 restart, 重啟PHP的FastCGI進程。  

reload, 重新加載PHP的php.ini。  

logrotate, 重新啟用log文件。  

reload是個很重要的參數,它可以在PHP的FastCGI進程不中斷的情況下重新加載改動過的php.ini,因此通過php-fpm可以平滑變更FastCGI模式下的PHP設置。

在FastCGI進程啟動後,其監聽的IP地址和端口也隨即啟動,可以通過ps和netstat查看相關信息。

 

[root@localhost php]# netstat -antl|grep

copyright © 萬盛學電腦網 all rights reserved