我有一个运行Apache2.4.6的CentOS 7服务器,带有事件MPM和PHP-FPMVersion5.6.10(来自repo)。下面是向vhost中的php发送请求的相关Apache配置(它是此服务器上的唯一站点):
<FilesMatch \.phpA0gt;
SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>下面是相关的php-fpm池conf:
listen = /var/run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
pm = static
pm.max_children = 50
pm.max_requests = 0下面是php-opcache配置(默认安装配置):
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist我的问题是:每当我安装和启用php-opcache时,错误日志中就会出现以下错误:
[Thu Jun 18 08:10:58.499871 2015] [mpm_event:debug] [pid 16546:tid 139798115227392] event.c(986): (104)Connection reset by peer: [client 157.55.39.233:15962] AH00470: network write failure in core output filter
[Thu Jun 18 08:10:58.527424 2015] [mpm_event:debug] [pid 16546:tid 139797922195200] event.c(986): (103)Software caused connection abort: [client 157.55.39.233:15990] AH00470: network write failure in core output filter如果删除php-opcache,错误将停止。每当出现这种情况时,用户都会在前端报告502服务不可用错误。
我至少花了6个小时试图谷歌并找到解决方案。有人说opcache的fastshutdown选项是个问题,但在默认配置中是禁用的。我将php过程管理方法更改为没有回收(max_requests=0)的静态过程管理方法,但这也没有改变任何东西。我还尝试在Apache (而不是套接字)中使用TCP代理方法,这也没有影响。
我不确定这是否相关,但无论是否安装了php-opcache,我都会在错误日志中得到以下错误报告(但频率要小得多,占所有通信量的0.5%,这可能是另一个问题):
[Thu Jun 18 08:32:37.223430 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] [client 37.46.115.238:55624] AH01068: Got bogus version 10, referer: ...
[Thu Jun 18 08:32:37.223462 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] (22)Invalid argument: [client 37.46.115.238:55624] AH01075: Error dispatching request to :, referer: ...这个问题非常类似于这一个,尽管那个人使用的是ProxyPassMatch和TCP方法,而我不是(因为是绕过.htaccess)。
有人有什么我没提过的想法吗?
发布于 2015-07-12 14:36:48
当我在我们的环境中看到类似的问题时,这似乎是因为OpCache (默认情况下)在共享宿主环境中的所有用户共享一个缓存的方式。一个错误已提交 (您可以也应该去投票让维护人员知道这对您的用例来说有多重要),尽管还没有对交付修复做出任何承诺。
TL;DR :默认情况下,当启用OpCache时,用于存储已编译字节码的缓存将在所有用户之间共享。在托管在多个站点/用户之间共享的环境中,这可能导致站点从另一个站点获取php脚本的缓存输出,或者,如果启用了特定的安全设置,甚至会生成错误.。
如果您计划使用PHP和PHP5.5+‘S构建在opcache中,请阅读下面的博客文章,然后才能真正做到这一点。结果是操作码缓存可以被服务器上的任何用户读取。这意味着,如果有10个单独的用户,拥有他们自己的vhost和目录,并且您为每个用户配置了一个PHP池,那么每个用户仍然可以看到缓存的脚本及其位置。由于它们可以读取对缓存的访问权限,所以它们可能会查看所有这些数据。这显然是一个巨大的安全问题,即使没有人利用这一点,在生成页面时仍然有可能被错误的用户读取脚本,因此如果缓存中有多个index.php脚本,网站可能会显示错误的数据/信息。
虽然没有正式发布修复程序,但是如果您使用的是cPanel、此wiki有一种配置php-fpm池的有文档记录的方法,该池将在每个用户的基础上创建和保护.,如果您按照下面的说明以及这个答案底部的重要说明,您应该能够获得您希望得到的功能,而不会出现任何错误。
这篇文章还记录了你如何在每个站点/每个用户的基础上手工配置(虽然我敢打赌,如果你托管了很多站点,这可能会变得很乏味)。如果您不使用cPanel,您可能需要修改脚本来指定您的各个路径和用户名,而不是cPanel的配置引擎使用的变量。
在测试和其他研究中,我遇到了可能与您的特定情况相关的这篇文章提供了一些澄清:
opcache.use_cwd参数设置为true,用于应用程序的OpCache配置--默认情况下将其设置为false,如果您在系统上承载多个OpCache应用程序,则将其设置为默认值可能会导致冲突:首先,在每个典型项目中,您可能必须确保将opcache.use_cwd选项设置为true。启用此设置意味着OpCache引擎将查看完整的文件路径,以区分具有相同名称的文件。将其设置为false将导致具有相同基名的文件之间发生冲突。
opcache.load_comments和opcache.save_comments指令设置为true。您应该在应用程序/框架文档中重复检查这一建议,因为大多数人现在都更新了自己的文档,并提供了关于如何在其系统中正确使用OpCache的具体说明:在使用注释的工具和框架中也有一个非常重要的设置。如果使用Doctrine、ZendFramework2或PHP,请记住将opcache.load_comments和opcache.save_comments设置设置为true。因此,您的文件中的文档注释也将包含在OpCache生成的预编译代码中。此设置将允许您在没有任何干扰的情况下处理注释。如果您的项目基于特定的框架或web应用程序,那么最好检查文档中有关OpCache配置的任何指南
希望这会有所帮助--如果您正在使用cPanel,那么请给我们一个注释,让我们知道您是如何处理配置的这一部分的!也请参阅这个问题&相关的注释。
https://serverfault.com/questions/699889
复制相似问题