CGI 、FastCGI、PHP-CGI、PHP-FPM 定義以及與nginx的應用關係
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返回給瀏覽器