php與nginx整合
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動態請求
#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的整個運作過程。
php與nginx整合
php.ini:php的主設定檔
?
1 |
[root@server79 php-5.4.12] # cp php.ini-production /usr/local/lnmp/php/etc/php.ini |
拷貝php的啟動指令碼
?
1 2 3 |
[root@server79 fpm] # pwd /root/php-5 .4.12 /sapi/fpm [root@server79 fpm] # cp init.d.php-fpm /etc/init.d/php-fpm |
給啟動指令碼加可執行許可權
?
1 2 3 4 5 6 |
[root@server79 fpm] # chmod +x /etc/init.d/php-fpm [root@server79 ~] # vim /usr/local/lnmp/php/etc/php.ini cgi.fix_pathinfo=0 date .timezone = /Asia/Shanghai [root@server79 ~] # cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf [root@server79 etc] # vim php-fpm.conf |
開啟注釋pid = run/php-fpm.pid
php-fpm.conf檔案參數解析
PHP的全域設定檔是php.ini,在上面的步驟中,已經將此檔案複製到了/usr/local/lnmp/php/etc/php.ini下。可以根據每個應用需求的不同,對php.ini進行相應的配置。
下面重點介紹PHP-FPM引擎的設定檔。
根據上面指定的安裝路徑,PHP-FPM的預設設定檔為/usr/local/lnmp/php/etc/php-fpm.conf。
php-fpm.conf是一個XML格式的純文字檔案,其內容很容易看明白。這裡重點介紹幾個重要的配置標籤:
標籤listen_address是配置fastcgi進程監聽的IP地址以及連接埠,預設是127.0.0.1:9000。
?
1 |
listen = 127.0.0.1:9000 |
標籤user和group用於設定運行FastCGI進程的使用者和使用者組。需要注意的是,這裡指定的使用者和使用者組要和Nginx設定檔中指定的使用者和使用者組一致。
?
1 2 |
user = nginx group = nginx |
標籤max_children用於設定FastCGI的進程數。根據官方建議,小於2GB記憶體的伺服器,可以只開啟64個進程,4GB以上記憶體的伺服器可以開啟200個進程。
?
1 |
<value name="max_children">5</value> |
標籤request_terminate_timeout用於設定FastCGI執行指令碼的時間。預設是0s,也就是無限執行下去,可以根據情況對其進行修改。
?
1 |
<value name="request_terminate_timeout">0s</value> |
標籤rlimit_files用於設定PHP-FPM對開啟檔案描述符的限制,預設值為1024。這個標籤的值必須和Linux核心開啟檔案數關聯起來,例如要將此值設定為65535,就必須在Linux命令列執行'ulimit -HSn 65536'。
?
1 |
<value name="rlimit_files">1024</value> |
標籤max_requests指明了每個children最多處理多少個請求後便會被關閉,預設的設定是500。
?
標籤allowed_clients用於設定允許訪問FastCGI進程解析器的IP地址。如果不在這裡指定IP地址,Nginx轉寄過來的PHP解析請求將無法被接受。
?
1 |
<value name="allowed_clients">127.0.0.1</value> |
5.管理FastCGI進程
在配置完php-fpm後,就可以啟動FastCGI進程了。啟動fastcgi進程有兩種方式:
?
1 |
/usr/local/php/bin/php-cgi --fpm |
或者
?
1 |
/usr/local/php/sbin/php-fpm start |
建議採用第二種方式啟動FastCGI進程。
/usr/local/php/sbin/php-fpm還有其他參數,具體為start|stop|quit|restart|reload|logrotate。
每個啟動參數的含義如下: q start,啟動PHP的FastCGI進程。 q stop,強制終止PHP的FastCGI進程。 q quit,平滑終止PHP的FastCGI進程。 q restart,重啟PHP的FastCGI進程。 q reload,重新載入PHP的php.ini。 q logrotate,重新啟用log檔案。 reload是個很重要的參數,它可以在PHP的FastCGI進程不中斷的情況下重新載入改動過的php.ini,因此通過php-fpm可以平滑變更FastCGI模式下的PHP設定。