1. 程式人生 > >LNMP架構十八(Nginx解析PHP相關配置)

LNMP架構十八(Nginx解析PHP相關配置)

十八、Nginx解析PHP相關配置

Nginx介紹(https://blog.csdn.net/sj349781478/article/details/84953766

PHP的介紹(https://blog.csdn.net/sj349781478/article/details/84879828

Nginx與PHP今天不是獨立存在,它們之間需要發生點關係,姿勢較豐富,請耐心欣賞。

1、what's FastCGi

     FastCGI是一個可伸縮,高速的在HTTP server和動態指令碼語言間通訊的介面。FastCGI支援多種指令碼語言和HTTP server。
     FCGI是由CGI發展改進而來的。傳統的CGI介面方式的效能很差。每次HTTP伺服器遇到動態程式時都需要重新啟動指令碼直譯器來執行解析,然後將結果返回給HTTP伺服器,這在處理高併發訪問時幾乎是不可用的。另外傳統的CGI介面方式安全性也很差,現在很少使用了。
     FCGI介面方式採用C/S結構,可以將HTTP伺服器和指令碼直譯器分開,同時在指令碼直譯器上啟動一個或者多個指令碼直譯器守護程序。當HTTP伺服器遇到動態程式時,可以將其直接交付給FCGI程序來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一的處理靜態請求或者動態指令碼的結果返回給客戶端,這就很大程度上提高了響應速度。

2、Nginx + FCGI執行原理

     Nginx 不支援對外部程式的直接呼叫或者解析,所有的外部程式(包括PHP)必須通過FCGI介面來呼叫。FCGI介面在linux是socket(這個socket是檔案socket,也可以是ip socket)。為了呼叫CGI程式,還需要一個FCGI的wrapper(wrapper可以理解為啟動另一個程式的程式)。這個wrapper繫結在某個固定的socket上,如埠或者檔案的socket,當Nginx將cgi請求傳送給這個socket的時候,通過FCGI介面,wrapper接收到請求,然後派生出一個新的執行緒,這個執行緒呼叫直譯器或者外部程式處理指令碼並讀取資料,接著,wrapper將返回的資料通過FCGi介面,沿著固定的socket傳給Nginx,最終,NGinx將返回的資料傳送給客戶端,這就是Nginx+FCGi的執行流程。如圖所示:

3、spawn-fcgi 和 php-fpm

     FCGI介面方式在指令碼解析伺服器上啟動一個或者多個守護程序對動態指令碼進行解析,這些程序就是FastCGI程序管理器,或者稱為fastCgi引擎,spawn-fcgi 和 PHP-FPM就是支援php的兩個Fcgi程序管理器。
     span-fcgi是HTTP伺服器lighttpd的一部分,目前是獨立的一個專案,一般與lighttpd配合使用來支援PHP,但是lighttpd的spwan-fcgi在高併發訪問的時候,會出現記憶體洩漏甚至自動重啟FastCGI的問題
     Nginx是個輕量級的HTTPserver,必須藉助第三方的FCGI處理器才可以對PHP進行解析。
     PHP-FPM是一個第三方的FCGI程序管理器,它是PHP的一個補丁來開發的,在安裝的時候也需要和PHP原始碼一起編譯

,也就是說PHP-FPM被編譯到PHP核心中,因此處理效能方面更加優秀,同時PHP-FPM在處理高併發方面也比spawn-fcgi引擎好很多,所以推薦NGINX+PHP-FPM組合。

    FCGI的主要優點是把動態語言和HTTP server分離開來,所以Nginx 與 php、php-fpm經常被部署在不同的伺服器上,以分擔前端Nginx的伺服器壓力,讓nginx 專一處理靜態請求和轉發動態請求。而PHP、PHP-fpm伺服器專一解析PHP動態請求。

4、重點介紹php-fpm引擎的配置檔案

php-fpm配置檔案我這裡放在/usr/local/php-fpm/etc/php-fpm.conf下面,預設情況下會把/usr/local/php-fpm/etc/fpm.d的配置檔案include進去。

vi   /usr/local/php-fpm/etc/fpm.d/www.conf

我們在9001.conf裡面看看以下幾項:

[9001]
    listen = 127.0.0.1:9001     #監聽了本地9001埠
    user = nginx          #執行使用者
    group = nginx
    pm.max_children = 50          # 設定fcgi的程序數,官方建議小於2G記憶體開啟64個,4G可以開200個
    request_terminate_timeout = 0     # 用於設定FCGI執行指令碼的時間,預設是0秒,可以根據情況改。
    rlimit_files = 1024      #設定PHP-FPM 開啟檔案描述符的限制,這個值要和linux核心開啟檔案數關聯起來,例如,要
將此值設定為65535,就必須在linux命令上執行ulimit -HSN 65536
    pm.max_requests = 500     #設定處理多少個請求後便會關閉,預設是500

    pm = static
    listen.allowed_clients = 127.0.0.1    # 設定允許訪問FCGI程序解析器的IP地址,如果不在IP地址,將無法接受
Nginx轉發過來的php解析請求。

瞭解完上訴配置後,就可以啟動FastCGI了,啟動命令如下:

 /usr/local/php-fpm/sbin/php-fpm -t

/etc/init.d/php-fpm start

5、配置nginx來支援php
我們切換到nginx虛擬檔案配置目錄下。

cd  /usr/local/nginx/conf/vhost

vi  first.conf

server {
    listen       80;
    server_name  first.com;
    charset utf8;


    location ~ \.php$ {

        include        fastcgi_params;
        root           /data/www/default;
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /data/www/default/$fastcgi_script_name;
    }
}

引數解釋

  • location 正則匹配到以php結尾的到這裡解析
  • root 指明瞭網站目錄,配置php程式放置的根目錄,這裡php程式放在/data/www/default下,php名稱info.php , php具體配置  <?php    phpinfo();?>
  • fastcgi_pass 指明瞭用哪裡的php-fpm來解析,指明用來監聽php-fpm的地址或者socket
  • fastcgi_index 指明預設首頁
  • fastcgi_param 指明的是php動態程式的主目錄,我們一般在這裡寫網站根目錄的路徑,比如我們的路徑是 /data/www/default。

fastcgi_index 語法:fastcgi_index file
預設值:none
使用欄位:http, server, location
如果URI以斜線結尾,檔名將追加到URI後面,這個值將儲存在變數$fastcgi_script_name中。例如:
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;
請求"/page.php",引數SCRIPT_FILENAME將被設定為"/home/www/scripts/php/page.php",但是請求"/"則為"/home/www/scripts/php/index.php"

 

6、檢查語法錯誤並且重新載入配置檔案:

# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload

檢測:

# curl -x127.0.0.1:80  first.com/info.php

出現的就是phpinfo()函式的介面