AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 705304
Accepted
Sander Marechal
Sander Marechal
Asked: 2015-07-14 02:44:07 +0800 CST2015-07-14 02:44:07 +0800 CST 2015-07-14 02:44:07 +0800 CST

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

  • 772

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

我有同一个网站的两个结帐。它们被设置为通过 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 进程。

apache-2.4
  • 1 1 个回答
  • 4540 Views

1 个回答

  • Voted
  1. Best Answer
    Bryan 'BJ' Hoffpauir Jr.
    2015-07-14T02:47:33+08:002015-07-14T02:47:33+08:00

    当我在我们的环境中看到类似的问题时,这似乎是因为 OpCache(默认情况下)在共享托管环境中的所有用户之间共享单个缓存的方式。已经提交了一个错误(您可以而且应该投票让维护人员知道这对您的用例可能有多重要),尽管没有承诺提供修复。

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

    如果您打算将 PHP-FPM 与 PHP 5.5+ 的内置 opcache 一起使用,请在实际操作之前阅读下面的博客文章。事实证明,服务器上的任何用户都可以读取操作码缓存。这意味着如果有 10 个不同的用户,拥有自己的虚拟主机和目录,并且您为每个用户配置一个 PHP-FPM 池,则每个用户仍然可以看到缓存的脚本及其位置。由于他们具有对缓存的读取访问权限,因此他们可能会查看所有这些数据。

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

    尽管尚未正式发布任何修复程序,但如果您使用的是 cPanel,此 wiki 有一个文档化的方式来配置要在每个用户基础上创建和保护的 php-fpm 池,并且如果您遵循以下说明以及此答案底部的重要说明您应该能够获得所需的功能而不会出现任何错误

    该帖子还记录了您如何在每个站点/每个用户的基础上手动配置它(尽管我敢打赌,如果您托管很多站点,这可能会变得乏味)。如果您不使用 cPanel,则可能需要修改脚本以指定您的个人路径和用户名,而不是 cPanel 配置引擎使用的变量。


    重要笔记

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

    1. 您需要确保为您的应用程序的 OpCache 配置设置该opcache.use_cwd参数-默认情况下设置为默认值,如果您在系统上托管多个 PHP 应用程序,则将其设置为默认值可能会导致冲突:truefalse

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

    1. 如果您正在运行由 Zend Framework 或其他使用注释的类似框架提供支持的应用程序,您还需要确保将opcache.load_commentsandopcache.save_comments指令设置为true. 您应该在您的应用程序/框架文档中仔细检查此建议,因为大多数人现在已经更新了他们的文档,其中包含有关为他们的系统正确使用 OpCache 的具体说明:

    在使用注释的工具和框架中,还有一个设置很重要。如果您使用 Doctrine、Zend Framework 2 或 PHP 单元,请记住将 opcache.load_comments 和 opcache.save_comments 设置设置为 true。因此,您文件中的文档注释也将包含在 OpCache 生成的预编译代码中。此设置将允许您使用注释而不会受到任何干扰。

    如果您的项目基于特定框架或 Web 应用程序,最好查看文档以了解有关 OpCache 配置的任何指南

    重要笔记


    希望这会有所帮助 - 如果您使用的是 cPanel,请发表评论,让我们知道您是如何处理这部分配置的!

    • 13

相关问题

  • SELinux 阻止 Apache 写入文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve