nginx自己不能處理PHP,它只是個web服務器,當接收到請求後,若是是php請求,則發給php解釋器處理,並把結果返回給客戶端。php
nginx通常是把請求發fastcgi管理進程處理,fascgi管理進程選擇cgi子進程處理結果並返回被nginxhtml
1、首先咱們先初步認識下FastCGI和Ngnix+FastCGI的運行原理mysql
一、apache+PHP和ngnix+php的區別linux
apache通常是把php當作本身的一個模塊來啓動;而ngnix則是把http請求變量轉發給php進程,即php獨立進程,與ngnix通訊,這種方式叫作FastCGI運行方式。nginx
因此,apache所編譯的php不能用於ngnix。web
先看一個簡單的圖:sql
如下這段我認爲是在網絡上找到的最通俗易懂的解釋,我將它複製進來方便你們理解:apache
一、什麼是FastCGI呢?vim
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。centos
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)。
wrapper: 爲了調用CGI程序,還須要一個FastCGI的wrapper(wrapper能夠理解爲用於啓動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後Fork(派生)出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據(html頁面或者圖片)發送給客戶端。這就是Nginx+FastCGI的整個運做過程,
因此,咱們首先須要一個wrapper,這個wrapper須要完成的工做:
2、編譯PHP
首先咱們先認識一個概念:php-fpm
(1)PHP-FPM是一個PHP FastCGI管理器,是隻用於PHP的,能夠在 http://php-fpm.org/download下載獲得
(2)PHP-FPM實際上是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP後纔可使用
(3)新版的PHP已經集成了php-fpm,在./configure的時候帶 –enable-fpm參數便可開啓PHP-FPM
接下來咱們開始安裝編譯PHP
一、編譯前咱們須要先安裝一些php須要用到的庫(我用的是centos版本的linux系統)
yum -y install gcc automake autoconf libtool make
yum -y install gcc gcc-c++ glibc
yum -y install libmcrypt-devel mhash-devel libxslt-devel \
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
krb5 krb5-devel libidn libidn-devel openssl openssl-devel
二、獲取php源碼包
wget http://cn2.php.net/distributions/php-5.4.7.tar.gz
三、解壓並進入php目錄
tar zvxf php-5.4.7.tar.gz
cd php-5.4.7
四、編譯並安裝
./configure --prefix=/usr/local/fastphp --enable-fpm --with-mcrypt \
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \
--enable-inline-optimization --with-bz2 --with-zlib --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
--with-gd --with-jpeg-dir
make all install
五、將php-fpm複製一份

六、將php配置文件複製一份

七、修改nginx配置文件以支持php-fpm
首先打開ngnix配置文件
vim /usr/local/ngnix/conf/ngnix.conf
在server段里加入如下代碼

保存
八、啓動php-fpm和ngnix
/usr/local/ngnix
/usr/local/ngnix/sbin/php-fpm
九、在根目錄下建立測試文件test.php作個簡單的測試

十、測試成功

php-fpm的關閉和重啓須要使用信號控制,其實就跟ngnix的關閉重啓同樣
php-fpm 關閉:kill -INT `cat /usr/local/fastphp/var/run/php-fpm.pid`
php-fpm 重啓:kill -USR2 `cat /usr/local/fastphp/var/run/php-fpm.pid`
查看php-fpm進程數:ps aux | grep -c php-fpm
Ngnix的安裝請查看個人另外一篇博文
http://www.cnblogs.com/it-cen/p/4310050.html
若是您以爲您能在此博文學到了新知識,請爲我頂一個,如文章中有解釋錯的地方,歡迎指出。
互相學習,共同進步!