在单个PHP-FPM池上创build多个用户

PHP-FPM / FastCGI启动并在我的cPanel / WHM服务器上运行,但我希望允许多个用户closures一个池。

通过将其添加到Global Post Vhost下的Apache包含编辑器中,让所有虚拟主机运行单个池是非常简单的:

<IfModule mod_fastcgi.c> FastCGIExternalServer /usr/local/sbin/php-fpm -host 127.0.0.1:9000 AddHandler php-fastcgi .php Action php-fastcgi /usr/local/sbin/php-fpm.fcgi ScriptAlias /usr/local/spin/php-fpm.fcgi /usr/local/sbin/php-fpm <Directory /usr/local/sbin> Options ExecCGI FollowSymLinks SetHandler fastcgi-script Order allow,deny Allow from all </Directory> </IfModule> 

但我想find一种方法来实现在用户下运行的PHP,但共享池。

我pipe理和控制在池下运行的所有域,所以我不担心每个帐户的文件的安全性,我只需要确保所有脚本可以由拥有这些文件的用户执行,而不需要更改文件每个帐户的权限,或者必须创build大量的虚拟主机包含文件。

快速和肮脏:在WHM打开主要的Apache包括窗口,粘贴这个:

 LoadModule fastcgi_module modules/mod_fastcgi.so #### 1 example configuration per project/user <VirtualHost 192.168.1.109:80> ServerName www.firstproject.com DocumentRoot /home/firstproject/public_html <IfModule mod_fastcgi.c> FastCgiExternalServer /tmp/fpm-firstproject -idle-timeout 7200 -socket /tmp/firstproject.sock Alias /tmp/fpm-engine /tmp/fpm-firstproject </IfModule> </VirtualHost> <VirtualHost 192.168.1.109:443> ServerName www.firstproject.com DocumentRoot /home/firstproject/public_html <IfModule mod_fastcgi.c> FastCgiExternalServer /tmp/fpm-firstprojectSSL -idle-timeout 7200 -socket /tmp/firstprojectSSL.sock Alias /tmp/fpm-engine /tmp/fpm-firstprojectSSL </IfModule> SSLEngine on SSLCertificateFile /var/cpanel/ssl/installed/certs/firstproject_com_cc6ae_82d03_1403300343_ec3d5db868775279d0976f0834065525.crt SSLCertificateKeyFile /var/cpanel/ssl/installed/keys/cc6ae_82d03_27967119f69793a369e32273af50bfea.key </VirtualHost> #### 2 example configuration per project/user <VirtualHost 192.168.1.109:80> ServerName www.secondproject.com DocumentRoot /home/secondproject/public_html <IfModule mod_fastcgi.c> FastCgiExternalServer /tmp/fpm-secondproject -idle-timeout 7200 -socket /tmp/secondproject.sock Alias /tmp/fpm-engine /tmp/fpm-secondproject </IfModule> </VirtualHost> #### 3 example configuration per project/user <VirtualHost 192.168.1.109:80> ServerName www.thirdproject.com DocumentRoot /home/thirdproject/public_html <IfModule mod_fastcgi.c> FastCgiExternalServer /tmp/fpm-thirdproject -idle-timeout 7200 -socket /tmp/thirdproject.sock Alias /tmp/fpm-engine /tmp/fpm-thirdproject </IfModule> </VirtualHost> <IfModule mod_fastcgi.c> <FilesMatch \.php$> SetHandler php-fpm </FilesMatch> Action php-fpm /tmp/fpm-engine </IfModule> 

然后再做下一步:

 mkdir -p /usr/local/etc/fpm.d/ cp php-fpm.conf.default /usr/local/etc/fpm.d/firstproject.conf mv php-fpm.conf.default php-fpm.conf 

现在打开这个文件/usr/local/etc/php-fpm.conf,并在Pool Defenitions部分删除所有内容,取消注释include = etc / fpm.d / *。conf并保存。

现在你去到/usr/local/etc/fpm.d/并打开你的项目configuration,更改池名称,监听地址,用户和组,pm。 参数,并在最下面覆盖php值。 重命名此文件的其他项目并根据需要更改参数。

祝你好运

这里提供的答案不再适用,因为APC的弃用和现代替代Zend的Optimizer +(PHP 5.4或更低版本)或OpCache(PHP 5.5 +)的行为…因为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的这一部分! 另见这个问题和相关的评论 。