1. 程式人生 > >CGI 、FastCGI、PHP-CGI、PHP-FPM 定義以及與nginx的應用關系

CGI 、FastCGI、PHP-CGI、PHP-FPM 定義以及與nginx的應用關系

example 反向代理 過大 溝通 訪問量 分配 路徑 bsp 允許

CGI

common gateway interface,簡稱cgi,簡而言之就是一個接口,一種協議。它的作用就是幫助服務器與語言通信。

這裏以nginx和php為例,因為nginx和php的語言不通,因此需要一個溝通轉換的過程,而CGI就是這個溝通的協議。nginx服務器在接受到瀏覽器傳遞過來的數據後,如果是一個動態的頁面請求,這個時候nginx就必須與php通信,這個時候就會需要用到cgi協議,將請求數據轉換成php能理解的信息,然後php根據這些信息返回的信息也要通過cgi協議轉換成nginx可以理解的信息,最後nginx接到這些信息再返回給瀏覽器。

CGI工作原理:每當客戶請求CGI的時候,WEB服務器就請求操作系統生成一個新的CGI解釋器進程(如php-cgi.exe),CGI 的一個進程則處理完一個請求後退出,下一個請求來時再創建新進程。

圖示:

技術分享圖片

FastCGI:

也是一種協議, 是cgi的優化版。由於cgi進程處理完後會退出,等待下次請求 然後再fork一個新的進程,如果訪問量大的話,就不太適合 ,於是,fastcgi應運而生。

PHP-CGI:

fastcgi是一種協議,而php-cgi實現了這種協議。不過它是單進程的,一個進程處理一個請求,處理結束後進程就銷毀

PHP-FPM:

是對php-cgi的改進版,它直接管理多個php-cgi進程/線程。也就是說,php-fpm是php-cgi的進程管理器,

php-fpm是 FastCGI 的實現,並提供了進程管理的功能。 進程包含 master 進程和 worker 進程兩種進程。 master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則一般有多個(具體數量根據實際需要配置),每個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。

php-fpm是php提供給web serve也就是http前端服務器的fastcgi協議接口程序,它不會像php-cgi一樣每次連接都會重新開啟一個進程,處理完請求又關閉這個進程,而是允許一個進程對多個連接進行處理,而不會立即關閉這個進程,而是會接著處理下一個連接。

php-fpm會開啟多個php-cgi程序,並且php-fpm常駐內存,每次web serve服務器發送連接過來的時候,php-fpm將連接信息分配給下面其中的一個子程序php-cgi進行處理,處理完畢這個php-cgi並不會關閉,而是繼續等待下一個連接,這也是fast-cgi加速的原理,但是由於php-fpm是多進程的,而一個php-cgi基本消耗7-25M內存,因此如果連接過多就會導致內存消耗過大,引發一些問題,例如nginx裏的502錯誤。

下面用圖來說明 瀏覽器請求web服務器的過程

技術分享圖片

ngnix與php-fpm的結合

Nginx不只有處理http請求的功能,還能做反向代理。Nginx通過反向代理功能將動態請求轉向後端Php-fpm

1。首先配置nginx.conf 文件

在nginx.conf最後一行,添加include文件

技術分享圖片

2。添加對應的server

進入上面include的路徑,添加一個server.

技術分享圖片

3啟用php的php-fpm來處理這個請求

打開php-fpm.conf文件,看到如下配置

技術分享圖片

由以上,我們可以總結出:瀏覽器從輸入一個網址到頁面展示 具體經歷了哪些

A:輸入網址,通過http協議 ,請求nginx服務器

B:路由到 server 裏配置的文件地址 例如:www.example.com/index.php

C: 加載nginx的fast-cgi模塊,fast-cgi監聽127.0.0.1:9000地址

D: 將請求文件地址(www.example.com/index.php) 請求到達127.0.0.1:9000

E:php-fpm 監聽127.0.0.1:9000,php-fpm 接收到請求,啟用worker進程處理請求,php-fpm 處理完請求,返回給nginx

F:nginx將結果通過http返回給瀏覽器

CGI 、FastCGI、PHP-CGI、PHP-FPM 定義以及與nginx的應用關系