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


Getting 500 Internal Server Error, readv() failed (104: Connection reset by peer) while reading upstream

我每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

有人知道可能发生的事情以及如何解决这种情况吗?

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

我花了很长时间,至少两周,在闪电战中浪费了一天的时间才发现这一点。

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

这个问题尤其成问题,因为它导致了更高的反弹率,当然也浪费了广告费用。

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

由于这条消息在谷歌Chrome中总是伴随着"错误337(net::ERR_SPDY_PROTOCOL_Error)",我想知道谷歌Chrome中是否破坏了对SPDY的支持(谷歌的一些讨论似乎表明谷歌服务器在2011年也遇到了类似的问题),或者我的nginx版本是否破坏了SPDY支持。将nginx升级到修复了SPDY错误的版本并没有帮助,我读到的关于Chrome问题的所有信息都表明,这只是谷歌服务器的问题,而且只是在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_ERRORs或随机连接中断。值得庆幸的是,禁用fastronghutdown似乎对性能没有任何重大影响(可能增加了1ms)。

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

您可以通过执行来检查是否有多个操作码缓存在运行

php -v

在命令行中。

我使用删除了php5-xcache包

apt-get remove php5-xcache --purge

一切又开始运转了。