在读取上游时获取500内部服务器错误,readv()失败(104:由对等方重置连接)

时间:2012-03-10 12:33:24

标签: nginx fastcgi php

我每次X调用都会收到HTTP 500(内部服务器错误)。我没有任何类型的高CPU负载(约为5%)。发生时,我可以在日志中看到这个错误:

在/var/log/nginx/error.log

readv() failed (104: Connection reset by peer) while reading upstream

在/var/log/php5-fpm.log

Mar 10 07:21:57.740683 [WARNING] [pool www] child 9413 exited with code 1 after 1117.708602 seconds from start
Mar 10 07:21:57.743140 [NOTICE] [pool www] child 9925 started

有谁知道会发生什么以及如何解决这种情况?

2 个答案:

答案 0 :(得分:2)

我最近在我管理的服务器上遇到了同样的问题。

我花了很长时间,至少2周,在blitz.io浪费了一天,然后才想出这个。

有时,网站上的任何网页都会随机中断。第一次点击没有效果,它只会加载部分页面,或者最常见的是,只有背景可见。它似乎发生在大约5%的时间。

这个问题尤其成问题,因为它促成了更高的跳出率,当然还有浪费的广告费用。

对于问题发生的确切时间,nginx日志只显示“readv()失败(104:对等连接重置),同时读取上游”,这意味着PHP中出现了问题。谷歌搜索显示没有适用于我的案例的这个问题的有用解决方案。即便如此,归咎于PHP并没有对我有多大意义,因为它似乎是在PHP已经将输出发送到浏览器之后发生的(毕竟我们会得到网站背景)。

由于此消息始终伴随着Google Chrome中的“错误337(net :: ERR_SPDY_PROTOCOL_ERROR)”,我想知道Google Chrome中是否有SPDY支持被破坏(一些Google讨论似乎表明Google服务器在2011年遇到类似问题) ,或者如果我的nginx版本破坏了SPDY支持。将nginx升级到具有SPDY错误修复的版本没有帮助,我读到的有关Chrome问题的所有内容都表明这只是Google服务器的一个问题,而且只是在2011年的这段时间内。

因此,在我的服务器上花了6个小时搞乱nginx,PHP和TCP超时之后,我已经准备放弃了。

由于过去我们在PHP 5.5的Zend Opcache和PayPal的Merchant SDK上遇到了麻烦,我想知道Zend Opcache是​​否也与此有关。最后我尝试完全禁用Zend Opcache,令人惊讶的是,我发现我无法再重现这个问题。

我通过Opcache文档阅读了希望看到我提到的另一个配置指令,或者没有提到可能导致此问题的配置指令。我真的不想回到XCache。毕竟,事实证明,Zend的速度提高了近40%。最后,我将其缩小到php.ini:

opcache.fast_shutdown = 1

我关闭了该设置,并且在Zend Opcache打开的情况下,不再有任何ERR_SPDY_PROTOCOL_ERROR或随机连接断开。值得庆幸的是,禁用fast_shutdown似乎没有对性能产生任何重大影响(可能已添加1毫秒)。

答案 1 :(得分:0)

将服务器从Debian 7(Wheezy)升级到Debian 8(Jessie)后,我遇到了同样的问题。在Debian 7上,我使用XCache作为操作码缓存。升级到Debian 8和PHP 5.6时,还安装并启用了Zend Opcode Cache。这两个操作码缓存开始了战争。

您可以通过执行

来检查是否有多个操作码缓存正在运行
php -v

在命令行。

我使用

删除了php5-xcache包
apt-get remove php5-xcache --purge

一切都开始了。