我们是否应该在 Apache+PHP-FPM 中为多个网站设置一个池?

我们是否应该在 Apache+PHP-FPM 中为多个网站设置一个池?

如果有许多小型网站(大约 300 个)在少量网络流量下运行,它们是否应该都使用同一个池,还是每个网站都使用单独的池更好?

让我们假设这些网站是值得信赖的,并且这里不考虑在池中拥有单独的用户/组的好处(例如更好地控制访问/权限)。

答案1

通常,我更喜欢每个网站使用一个池(但也许不是在这里,请阅读全部)。

主要原因是允许每个网站都有 php 设置。这些设置可能会根据网站的需求而有所不同,但也是为了更好地分离网站资源。例如,更改临时目录或 open_basedir_settings:

(...)
env[TMP] = /path/to/client/var/tmp
env[TMPDIR] = /path/to/client/var/tmp
env[TEMP] = /path/to/client/var/tmp
env[DOCUMENT_ROOT] = /path/to/client/www
php_admin_value[open_basedir] = ".:/path/to/client/www:/path/to/client/var/tmp:/path/to/client/var/log"
php_admin_value[upload_tmp_dir]="/path/to/client/var/tmp"
(...)

您还可以使用chrootphp-fpm 的模式,但这更复杂。在这种情况下,使用 chrooted 池,可能更容易为所有客户端仅使用一个池(因此共享 chroot,事实上这不是很好)。这是因为 apc 之类的东西由所有池共享,这意味着使用多个 chrooted 池,您最终可能会得到在不同的池中具有相同路径的多个文件,而 apc 只会存储文件的一个缓存版本。事实上,在 apc+chroot 的情况下,最好的解决方案是运行多个 php-fpm 实例,每个实例一个池。对于 300 个网站来说,这不是一件容易的事。

然后,您可以使用池设置管理每个网站可以使用多少个 php 进程pm.[static/dynamic]。请注意,对于 300 个小型网站这可能会成为一个问题,如果大量这些网站不活跃,那么您的很大一部分内存将被不执行任何操作的池进程使用。

在你的情况下,流量很低,网站很少,所以有超过 300 个(至少)池进程在你的机器上运行,什么也不做,是一种过度杀伤。而对于您的具体情况,我认为我应该使用较少数量的池(也许您可以按应用程序、按版本、按需求将一些网站分组),每个池可以运行多个网站。或者可能只有一个,我会尝试使用网站组对它们应用一些 open_basedir 限制,但如果它们真的都一样,您可以只使用一个池来运行。

相关内容