使用 FastCGI 模式執行 PHP7 教學

2020-07-16 10:06:14

眾所周知,常用的跟php搭配的web server 有兩個,apache 和nginx,編譯完server之後需要設定下才可以正常解析php檔案。下面我們來看下兩種伺服器是如何解析php檔案。

Nginx

一、主流的nginx+php的執行原理如下:

1、nginx的worker進程直接管理每一個請求到nginx的網路請求。

2、對於php而言,由於在整個網路請求的過程中php是一個cgi程式的角色,所以採用名為php-fpm的進程管理程式來對這些被請求的php程式進行管理。php-fpm程式也如同nginx一樣,需要監聽埠,並且有master和worker進程。worker進程直接管理每一個php進程。

3、關於fastcgi:fastcgi是一種進程管理器,管理cgi進程。市面上有多種實現了fastcgi功能的進程管理器,php-fpm就是其中的一種。再提一點,php-fpm作為一種fast-cgi進程管理服務,會監聽埠,一般預設監聽9000埠,並且是監聽本機,也就是只接收來自本機的埠請求,所以我們通常輸入命令netstat -nlpt|grep php-fpm 會得到:

tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1078/php-fpm

4、關於fastcgi的組態檔,目前fastcgi的組態檔一般放在nginx.conf同級目錄下,組態檔形式,一般有兩種:fastcgi.conf 和 fastcgi_params。不同的nginx版本會有不同的組態檔,這兩個組態檔有一個非常重要的區別:fastcgi_parames檔案中缺少下列設定:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

我們可以開啟fastcgi_parames檔案加上上述行,也可以在要使用設定的地方動態新增。使得該設定生效。

5、當需要處理php請求時,nginx的worker進程會將請求移交給php-fpm的worker進程進行處理,也就是最開頭所說的nginx呼叫了php,其實嚴格得講是nginx間接呼叫php。

二、nginx 設定

來看一個host的簡單設定:

server {
    listen       80;
    server_name  example.com;
    location ~ .php?.*$ {
        root           /home/mark/www;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

1、第一個大括號 server{ }不必多說,代表一個獨立的server

2、listen 80代表該server監聽8011埠

3、location ~ .php?.*${ }代表一個能匹配對應uri的location,用於匹配一類uri,並對所匹配的uri請求做自定義的邏輯、設定。這裡的location,匹配了所有帶.php的uri請到該location內的uri請求看做是cgi程式,並將請求傳送到9000埠,交由php-fpm處理。

6、fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 動態新增了一行fastcgi設定,設定內容為SCRIPT_FILENAME,告知管理進程,cgi指令碼名稱。由於我的nginx中只有fastcgi_params檔案,沒有fastcgi.conf檔案,所以要使php-fpm知道SCRIPT_FILENAME的具體值,就必須要動態的新增這行設定。

7、include fastcgi_params 引入fastcgi組態檔

以上就是最簡潔版的nginx啟動php指令碼的最簡設定,當重新啟動nginx之後,在/home/mark/www目錄下建立一個hello.php檔案,輸入<?php echo "hello world"; ?>儲存,然後在瀏覽器中存取localhost/hello.php就可以在網頁上顯示hello world了。

Apache

相比nginx ,apache 設定fastcgi稍微麻煩些,SetHandler/ProxyPassMatch/ProxyPass/Mod_Rewrite 都可以做到,這裡我們只說官方推薦的ProxyPassMatch方法。

載入代理模組

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

設定虛擬主機支援

<VirtualHost *:80>
    DocumentRoot "/home/mark/www"
    ServerName test.com
    DirectoryIndex /index.php index.php
    ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/home/mark/www/$1  
  <Directory "/home/mark/www">
    Options none
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

重新啟動apache,測試下,ok~

以上就是使用 FastCGI 模式執行 PHP7 教學的詳細內容,更多請關注TW511.COM其它相關文章!