Nginx與FPM的工作機制實例分享

小云云
發布: 2023-03-20 15:52:01
原創
1323 人瀏覽過

網路上有很多關於如何設定Nginx + FPM 的文章,但它們更多從操作的角度出發,告訴我們怎麼做,但卻沒有告訴我們為什麼要這麼做,本文從Nginx 與FPM 的工作機製出發,探討配置背後的原理,讓我們真正理解Nginx 與PHP 是如何協同工作的。

要說 Nginx 與 PHP 是如何協同運作的,首先得說 CGI (Common Gateway Interface) 和 FastCGI 這兩個協定。

CGI 是 Web Server 與後台語言互動的協議,有了這個協議,開發者可以使用任何語言處理 Web Server 發來的請求,動態的生成內容。但 CGI 有一個致命的缺點,那就是每處理一個請求都需要 fork 一個全新的進程,隨著 Web 的興起,高並發越來越成為常態,這樣低效的方式明顯不能滿足需求。就這樣,FastCGI 誕生了,CGI 很快就退出了歷史的舞台。 FastCGI,顧名思義為更快的 CGI,它允許在一個進程內處理多個請求,而不是一個請求處理完畢就直接結束進程,性能上有了很大的提高。

至於 FPM (FastCGI Process Manager),它是 FastCGI 的實現,任何實現了 FastCGI 協定的 Web Server 都能夠與之通訊。 FPM 之於標準的 FastCGI,也提供了一些增強功能,具體可以參考官方文件:PHP: FPM Installation

FPM 是一個PHP 進程管理器,包含master 進程和worker 進程兩種進程:master 進程只有一個,負責監聽端口,接收來自Web Server 的請求,而worker 進程則一般有多個(具體數量根據實際需求配置),每個進程內部都嵌入了一個PHP 解釋器,是PHP 程式碼真正執行的地方,下圖是我本機上fpm 的進程情況,1一個master 進程,3個worker 進程:


從FPM 接收到請求,到處理完畢,其具體的流程如下:

  1. ##FPM 的master 進程接收到請求

  2. master 進程根據組態指派特定的worker 進程進行請求處理,如果沒有可用進程,回傳錯誤,這也是我們配合Nginx 遇到502錯誤比較多的原因。


  3. worker 進程處理請求,如果逾時,回傳504錯誤


  4. ##請求處理結束,回傳結果
  5. FPM 從接收到處理請求的流程就是這樣了,那麼Nginx 又是如何傳送請求給fpm 的呢?這就需要從 Nginx 層面來說明了。

我們知道,Nginx 不只是一個Web 伺服器,也是一個功能強大的Proxy 伺服器,除了進行http 請求的代理,也可以進行許多其他協定請求的代理,包括本文與fpm 相關的fastcgi 協議。為了能夠使 Nginx 理解 fastcgi 協議,Nginx 提供了 fastcgi 模組來將 http 請求對應為對應的 fastcgi 請求。

Nginx 的 fastcgi 模組提供了 fastcgi_param 指令來主要處理這些映射關係,下面 Ubuntu 下 Nginx 的一個配置文件,其主要完成的工作是將 Nginx 中的變數翻譯成 PHP 中能夠理解的變數。

除此之外,非常重要的就是 fastcgi_pass 指令了,這個指令用來指定 fpm 行程監聽的位址,Nginx 會把所有的 php 請求翻譯成 fastcgi 請求之後再傳送到這個位址。下面一個簡單的可以工作的 Nginx 設定檔:

在這個設定檔中,我們新建了一個虛擬主機,監聽在 80 端口,Web 根目錄為 /home/rf/projects/wordpress。然後我們透過 location 指令,將所有的以 .php 結尾的請求都交給 fastcgi 模組處理,從而把所有的 php 請求都交給了 fpm 處理,從而完成 Nginx 到 fpm 的閉環。

如此以來,Nginx 與 FPM 通訊的整個流程應該比較清晰了吧。

相關推薦:

詳細介紹Linux下安裝php環境並且設定Nginx支援php-fpm模組(圖文)

PHP -FPM運作狀態的即時檢視及監控詳解

php使用php-fpm重新啟動、停止操作指令

#

以上是Nginx與FPM的工作機制實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板