nginx+php-fpm實現原理及問題記錄

FastCGI原理

    FastCGI是一個運用於Http Server和動態腳本語言間通訊的接口,多數流行的Http Server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。 php

    FastCGI接口方式採用C/S結構,能夠將HttP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。當HttP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給客戶端。這種方式能夠讓HttP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。 html

Nginx+php-fpm實現原理

    Nginx自己不會對PHP進行解析,終端對PHP頁面的請求將會被Nginx交給FastCGI進程監聽的IP地址及端口,由php-fpm做爲動態解析服務器處理,最後將處理結果再返回給nginx。其實,Nginx就是一個反向代理服務器。Nginx經過反向代理功能將動態請求轉向後端php-fpm,從而實現對PHP的解析支持,這就是Nginx實現PHP動態解析的原理。 java

    

    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

Nginx 簡單配置 

location ~ \.php$ {
         root           /home/admin/web/nginx/html/;
         fastcgi_pass   127.0.0.1:9000;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  /home/admin/web/nginx/html/$fastcgi_script_name;
         include        fastcgi_params;
        }

PHP-FPM簡單配置

     cp 你的php源碼安裝包/php.ini-production  /home/admin/web/php/lib/php.ini web

     cp /home/admin/web/php/etc/php-fpm.conf.default  /home/admin/web/php/etc/php-fpm.conf 後端

問題記錄

    錯誤一:2014/04/04 15:04:35 [error] 10159#0: *87 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.102.132, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.102.132:8080"    服務器

        方法一:修改fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; app

        方法二:若是你是非root帳戶,使用普通帳戶操做,可能出現權限問題致使你出現以上錯誤,那麼,請經過chmod -R  755 你的安裝目錄文件夾 試一試 ? socket

    錯誤二:04-Apr-2014 12:31:15] NOTICE: PHP message: PHP Warning:  Module 'PDO' already loaded in Unknown on line 0 php-fpm

        方法:將php.ini 中extension=pdo.so  註釋掉;

    錯誤三:[04-Apr-2014 12:31:15] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
                [04-Apr-2014 12:31:15] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root

        方法:就用root來執行開啓php-fpm吧!(nginx 也用root)或者sudo!

感謝:http://book.51cto.com/art/201202/314644.htm

相關文章
相關標籤/搜索