使用 apache 2.4 代理在 php-fpm 上启用 zend_opcache 时出错

使用 apache 2.4 代理在 php-fpm 上启用 zend_opcache 时出错

我正在 ubuntu 上组合 php-fpm 5.5.9 和 apache 2.4.10 来设置一个网络服务器来托管几个小型网站(主要是 wordpress)。

在阅读了大量的教程和帖子之后,我决定设置 php-fpm 来为每个网站运行一个套接字,并使用 apache 上的 mod_proxy_fcgi 将请求重定向到 php-fpm。

<LocationMatch "^(.*\.php)$">
ProxyPass unix:///var/run/php5-fpm-saintsein.com.sock|fcgi://127.0.0.1:9000/home/saintsein/public_html/
</LocationMatch>

我让一切都运行得非常顺利,但是一旦我在 php 配置中启用 Zend Opcache,我就会随机在网站上收到错误消息。

我得到的唯一日志条目是这样的:

Connection reset by peer: [client 194.78.30.55:55202] AH01075: Error dispatching request to : 

我已经在网上搜索过了,没发现有人遇到 Zend Opcache 状态的这个特定错误。

有人知道哪里出了问题吗?或者我该如何调试它?

答案1

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

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

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

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

虽然官方尚未发布修复程序,但如果你正在使用 cPanel,此 wiki 记录了如何配置 php-fpm 池以根据每个用户进行创建和保护如果你遵循以下说明以及重要笔记在这个答案的底部,你应该能够获得你想要的功能而不会出现任何错误

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


重要笔记

在测试和进一步研究期间我遇到了这篇文章提供了一些澄清这可能与您的具体情况相关:

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

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

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

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

如果你的项目基于特定的框架或 Web 应用程序,最好检查文档中是否有关于 OpCache 配置的指南

重要笔记


希望这会有所帮助 - 如果您使用 cPanel,请发表评论让我们知道您如何处理这部分配置! 另请参阅此问题和相关评论

相关内容