我有两个具有两个代码库的网站,但是当我更改一个代码库时,我看到两者都发生了变化。
我有同一个网站的两个结帐。它们被设置为通过 Apache2 和 FastCGI 使用 PHP-FPM。结帐在:
/var/www/site1
/var/www/site2
Apache 配置如下所示:
<VirtualHost *:80>
ServerName site1.myserver.com
DocumentRoot /var/www/site1
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
<VirtualHost *:80>
ServerName site2.myserver.com
DocumentRoot /var/www/site2
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
FPM 池配置如下所示:
[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited
[site2]
user = site2-user
group = site2-group
listen = /var/run/site2-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited
我没有使用 FPM 的 chroot 功能(据我所知)。
当我更改 site1 的代码并重新启动 PHP-FPM 并访问 site1 和 site2 时,我在两个站点上都看到了更改。
如果我重新启动 PHP-FPM 并首先访问 site2(未更改的站点),然后是 site1,那么我在任何一个站点上都看不到更改。
我的配置有什么问题?我确实看到在主 FPM 主机下为 site1 和 site2 运行单独的 PHP-FPM 进程。
当我在我们的环境中看到类似的问题时,这似乎是因为 OpCache(默认情况下)在共享托管环境中的所有用户之间共享单个缓存的方式。已经提交了一个错误(您可以而且应该投票让维护人员知道这对您的用例可能有多重要),尽管没有承诺提供修复。
TL;DR:默认情况下,启用 OpCache 时,用于存储已编译字节码的缓存在所有用户之间共享。在多个站点/用户之间共享托管的环境中,这可能导致站点从另一个站点获取缓存的 php 脚本输出,或者如果启用了特定的安全设置,甚至会产生错误。
尽管尚未正式发布任何修复程序,但如果您使用的是 cPanel,此 wiki 有一个文档化的方式来配置要在每个用户基础上创建和保护的 php-fpm 池,并且如果您遵循以下说明以及此答案底部的重要说明您应该能够获得所需的功能而不会出现任何错误
该帖子还记录了您如何在每个站点/每个用户的基础上手动配置它(尽管我敢打赌,如果您托管很多站点,这可能会变得乏味)。如果您不使用 cPanel,则可能需要修改脚本以指定您的个人路径和用户名,而不是 cPanel 配置引擎使用的变量。
重要笔记
在测试和其他研究期间,我遇到了这篇文章,其中提供了一些可能与您的具体情况相关的说明:
opcache.use_cwd
参数-默认情况下设置为默认值,如果您在系统上托管多个 PHP 应用程序,则将其设置为默认值可能会导致冲突:true
false
opcache.load_comments
andopcache.save_comments
指令设置为true
. 您应该在您的应用程序/框架文档中仔细检查此建议,因为大多数人现在已经更新了他们的文档,其中包含有关为他们的系统正确使用 OpCache 的具体说明:重要笔记
希望这会有所帮助 - 如果您使用的是 cPanel,请发表评论,让我们知道您是如何处理这部分配置的!