两个独立的PHP-FPM网站似乎使用相同的代码?

我有两个网站有两个代码库,但是当我更改一个代码库时,我看到了两个网站的变化。

我有两个同一个网站的结帐。 它们被设置为通过Apache2和FastCGI使用PHP-FPM。 结帐在:

/var/www/site1 /var/www/site2 

Apache的configuration如下所示:

 <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池的configuration如下所示:

 [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,然后我没有看到任何一个站点上的更改。

我的configuration有什么问题? 我看到在主FPM主站下运行site1和site2的单独PHP-FPM进程。

当我在我们的环境中看到类似的问题时,似乎是因为OpCache(默认情况下)共享主机环境中的所有用户共享一个caching。 已经提交了一个错误 (你可以也应该去投票让维护者知道这对你的用例有多重要),但是没有提供修复的承诺。

TL; DR:默认情况下,启用OpCache时,用于存储编译的字节码的caching将在所有用户之间共享。 在多个站点/用户共享主机的环境中, 这可能会导致站点从其他站点抓取php脚本的caching输出,或者如果启用了特定的安全设置,甚至会产生错误 。

如果您计划使用带有PHP 5.5 +的内置opcache的PHP-FPM,请在实际执行之前阅读下面的博客文章。 事实certificate,操作码caching可以被服务器上的任何用户读取。 这意味着,如果有10个独立的用户,拥有自己的虚拟主机和目录,并且为每个用户configuration了一个PHP-FPM池,则每个用户仍然可以看到caching了哪些脚本及其位置。 由于他们已经读取了caching,他们可能会查看所有这些数据。

这显然是一个巨大的安全问题,即使没有人利用这个,在生成一个页面的时候仍然有一个错误的用户读取脚本的机会,所以如果有多个索引,网站可能会显示错误的数据/信息.php脚本在caching中。

虽然没有修正已经正式发布,如果你使用的是cPanel, 这个wiki有一个文件化的方式来configurationphp-fpm池在每个用户的基础上创build和保护 ,如果你按照下面的说明以及重要的注意事项在这个答案的底部,你应该能够得到你想要的function,没有任何错误

这篇文章还logging了如何在每个站点/每个用户的基础上手动configuration这个function(尽pipe如果你要托pipe很多站点,我会打赌这可能会变得单调乏味)。 如果你不使用cPanel,你可能需要修改脚本来指定你的个人path和用户名,而不是cPanel的configuration引擎使用的variables。


重要笔记

在testing和其他研究过程中,我遇到了这篇文章,它提供了一些可能与您的具体情况相关的说明:

  1. 您需要确保opcache.use_cwd参数设置为true以便您的应用程序configurationOpCache – 默认情况下设置为false ,如果您在您的主机上托pipe多个PHP应用程序,则将其设置为默认值可能会导致冲突系统:

首先,可能在每个典型的项目中,你必须确保opcache.use_cwd选项设置为true。 启用此设置意味着OpCache引擎将查看完整的文件path以区分具有相同名称的文件。 将其设置为false将导致具有相同基本名称的文件之间发生冲突。

  1. 如果您正在运行由Zend Framework或其他使用注释的类似框架的应用程序,则还需要确保opcache.load_commentsopcache.save_comments指令设置为true 。 您应该仔细检查一下您的应用程序/框架文档中的build议,因为大多数人现在已经更新了他们的文档,并具体说明了如何在系统中正确使用OpCache:

在使用注释的工具和框架中还有一个重要的设置。 如果您使用Doctrine,Zend Framework 2或PHP Unit,请记住将opcache.load_comments和opcache.save_comments设置为true。 结果,来自文件的文档注释也将包含在OpCache生成的预编译代码中。 这个设置将允许你在没有任何中断的情况下使用注释。

如果您的项目基于特定的框架或Web应用程序,则最好检查文档以获取有关OpCacheconfiguration的任何指导原则

重要笔记


希望这有助于 – 如果您使用cPanel,请发表评论,让我们知道您是如何处理configuration的这一部分!