nginx - 收到 500 内部服务器错误,readv() 失败 (104 : Connection reset by peer) while reading upstream

标签 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

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

最佳答案

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

我花了很长时间,至少两周,在 blitz.io 浪费了一天时间才弄清楚这个问题。

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

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

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

由于此消息在 Google Chrome 中始终伴随着“Error 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 毫秒)。

关于nginx - 收到 500 内部服务器错误,readv() 失败 (104 : Connection reset by peer) while reading upstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646445/

相关文章:

php - setTimeout 无法与 jQuery 和 load() 一起正常工作

regex - NGINX hashbang重写

ruby-on-rails - 如何添加 www.使用 NginX 和 SSL 域名?

html - 如何在没有客户端脚本的情况下让 Web 客户端处理表单以将页面 ID 信息发送到服务器

debugging - 如何查看Azure fastCGI上的实际错误?

php - NGINX/PHP 下载而不是执行

nginx - Kubernetes Nginx入口路由路径

Django 错误(外部 IP): Invalid HTTP_HOST header: '*.domain.com'

php - 更改 PHP/SQL 查询时出现的问题

php - 将连接字符串转换为单个字符串作为 php 中的变量