如何在 NGINX 中设置单独的 PHP-FPM 池
已出版: 2025年2月15日 UTC 11:53:14
最后更新 2026年1月12日 UTC 08:30:09
在本文中,我将介绍运行多个 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 进程池,并且不会与其他虚拟主机共享子进程。
