編譯PHP並與Ngnix整合


nginx本身不能處理PHP,它只是個web服務器,當接收到請求后,如果是php請求,則發給php解釋器處理,並把結果返回給客戶端。

nginx一般是把請求發fastcgi管理進程處理,fascgi管理進程選擇cgi子進程處理結果並返回被nginx

一、首先我們先初步認識下FastCGI和Ngnix+FastCGI的運行原理

    1、apache+PHP和ngnix+php的區別

      apache一般是把php當做自己的一個模塊來啟動;而ngnix則是把http請求變量轉發給php進程,即php獨立進程,與ngnix通信,這種方式叫做FastCGI運行方式。

      所以,apache所編譯的php不能用於ngnix。

    先看一個簡單的圖:

  

  以下這段我認為是在網絡上找到的最通俗易懂的解釋,我將它復制進來方便大家理解:

  1、什么是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服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

  2、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需要完成的工作:

  1. 通過調用fastcgi(庫)的函數通過socket和ningx通信(讀寫socket是fastcgi內部實現的功能,對wrapper是非透明的)
  2. 調度thread,進行fork和kill
  3. 和application(php)進行通信

二、編譯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

  1、編譯前我們需要先安裝一些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

 

   2、獲取php源碼包

    wget http://cn2.php.net/distributions/php-5.4.7.tar.gz

 

   3、解壓並進入php目錄

    tar zvxf php-5.4.7.tar.gz

    cd php-5.4.7

    

 

 

   4、編譯並安裝

    ./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

 

  5、將php-fpm復制一份
  

  6、將php配置文件復制一份
  

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

  8、啟動php-fpm和ngnix
    /usr/local/ngnix
    /usr/local/ngnix/sbin/php-fpm

  9、在根目錄下創建測試文件test.php做個簡單的測試
    

  10、測試成功
    



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

  


  如果您覺得您能在此博文學到了新知識,請為我頂一個,如文章中有解釋錯的地方,歡迎指出。

  互相學習,共同進步!

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM