如何在 NGINX 中設定單獨的 PHP-FPM 池
已發佈: 2025年2月15日 上午11:53:15 [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 子進程池而不是在同一個池中運行所有進程有許多優點。其中,安全、分離/隔離和資源管理是其中幾個主要因素。
無論你的動機是什麼,這篇文章都會幫助你實現它:-)
第 1 部分 - 設定新的 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指令可能看起來像這樣:
您可以將其更改為您想要的任何有效名稱,但同樣,我建議堅持使用類似於設定檔名的名稱,因此您可以例如將其設為:
好的,然後儲存檔案並退出文字編輯器。
第 2 部分 - 更新 NGINX 虛擬主機配置
現在,您需要打開 NGINX 虛擬主機文件,並將您想要更改為新池的 FastCGI 配置更改為新池 - 或者更確切地說,連接到新的套接字。
在 Ubuntu 14.04 上,這些預設儲存在 /etc/nginx/sites-available 下,但也可以在其他位置定義。您可能最清楚您的虛擬主機配置位於何處;-)
在您最喜歡的文字編輯器中開啟相關設定檔並尋找定義 PHP-FPM 套接字的fastcgi_pass指令(必須在位置上下文中)。您必須更改此值以使其與您在第一步中建立的新 PHP-FPM 池配置相匹配,因此繼續我們的範例,您應將其變更為:
fastcgi_pass unix:/var/run/php5-fpm-mypool.sock;
然後儲存並關閉該文件。你現在快完成了。
第 3 部分 - 重新啟動 PHP-FPM 和 NGINX
若要套用所做的組態更改,請重新啟動 PHP-FPM 和 NGINX。重新加載可能就足夠了,而不是重新啟動,但我發現這有點碰運氣,取決於更改了哪些設定。在特定情況下,我希望舊的 PHP-FPM 子進程立即死亡,因此需要重新啟動 PHP-FPM,但對於 NGINX 來說,重新載入可能就足夠了。親自嘗試一下。
sudo service nginx restart
瞧,您已經完成了。如果您正確完成了所有操作,那麼您修改的虛擬主機現在應該使用新的 PHP-FPM 池,並且不會與任何其他虛擬主機共用子進程。