如何在 NGINX 中設定單獨的 PHP-FPM 池
已發佈: 2025年2月15日 上午11:53:15 [UTC]
最後更新: 2026年1月12日 上午8:30:10 [UTC]
在本文中,我將介紹執行多個 PHP-FPM 池並透過 FastCGI 將 NGINX 連接到它們所需的設定步驟,從而實現虛擬主機之間的進程分離和隔離。
How to Set Up Separate PHP-FPM Pools in NGINX
本文資訊是基於運行在 Ubuntu Server 14.04 x64 上的 NGINX 1.4.6 和 PHP-FPM 5.5.9。對於其他版本,其有效性可能存在差異。 (更新:經確認,在 Ubuntu Server 24.04、PHP-FPM 8.3 和 NGINX 1.24.0 上,本文所有步驟仍然有效。)
與將所有進程運行在同一個進程池中相比,設定多個 PHP-FPM 子進程池有許多優點。安全性、隔離性和資源管理是其中幾個主要優勢。
無論你的動機是什麼,這篇文章都會對你有幫助 :-)
第一部分 – 設定新的 PHP-FPM 池
首先,你要找到 PHP-FPM 儲存連接池配置的目錄。在 Ubuntu 14.04 上,預設情況下是 /etc/php5/fpm/pool.d。該目錄下可能已經存在一個名為 www.conf 的文件,其中包含預設連接池的配置。如果你之前沒有查看過該文件,建議你仔細閱讀並根據你的伺服器配置進行調整,因為預設設定是針對性能較低的伺服器的。但現在,只需複製一份即可,這樣我們就不用從頭開始了。
當然,你可以把「mypool」替換成你想給泳池的任何名字。
現在用 nano 或其他你喜歡的文字編輯器開啟新文件,並根據你的需求進行調整。你可能需要調整子進程數,以及進程池運行的使用者和使用者群組,但有兩個設定你必須更改:進程池的名稱和它監聽的套接字,否則它會與現有進程池衝突,導致程式停止運行。
連接池的名稱位於檔案頂部附近,用方括號括起來。預設值為 [www]。您可以根據需要更改它;我建議使用與設定檔相同的名稱,因此在本範例中,請將其變更為 [mypool]。如果您不更改它,PHP-FPM 似乎只會加載第一個具有該名稱的配置文件,這很可能會導致問題。
接下來,您需要變更正在監聽的套接字或位址,這由 listen 指令定義。預設情況下,PHP-FPM 使用 Unix 套接字,因此您的 listen 指令可能如下所示:
您可以將其更改為任何有效的名稱,但我建議您使用與設定檔名稱類似的名稱,例如您可以將其設定為:
好的,儲存檔案並退出文字編輯器。
第二部分 – 更新 NGINX 虛擬主機配置
現在,你需要打開 NGINX 虛擬主機文件,其中包含你想要更改為新池的 FastCGI 配置——或者更確切地說,連接到新的套接字。
在 Ubuntu 14.04 中,這些配置預設儲存在 /etc/nginx/sites-available 目錄下,但也可以定義在其他位置。您可能最清楚您的虛擬主機配置在哪裡 ;-)
用你喜歡的文字編輯器開啟相關的設定文件,找到定義 PHP-FPM 套接字的 fastcgi_pass 指令(必須位於 location 上下文中)。你需要修改這個值,使其與你在第一步中建立的新 PHP-FPM 連線池配置相符。繼續我們的範例,你需要將其修改為:
fastcgi_pass unix:/var/run/php5-fpm-mypool.sock;
然後儲存並關閉該文件。你現在就快完成了。
第三部分 – 重啟 PHP-FPM 和 NGINX
若要套用您所做的設定更改,請重新啟動 PHP-FPM 和 NGINX。雖然重新加載可能就足夠了,但我發現這並不總是有效,具體取決於您更改了哪些設定。就我而言,我希望舊的 PHP-FPM 子進程立即終止,因此需要重新啟動 PHP-FPM,但對於 NGINX 來說,重新載入可能就足夠了。您可以自己嘗試。
sudo service nginx restart
好了,大功告成。如果一切操作正確,您修改的虛擬主機現在應該正在使用新的 PHP-FPM 進程池,並且不會與其他虛擬主機共用子進程。
