【发布时间】:2010-12-16 12:57:48
【问题描述】:
我使用 nginx 和 fastcgi。我在错误日志中看到很多以下错误
readv() 失败(104:连接重置 由同行)同时阅读上游和 recv() 失败(104:连接重置 由对等方)在读取响应标头时 来自上游
我认为使用该应用程序没有任何问题。这些错误是否严重或如何消除它们。
【问题讨论】:
我使用 nginx 和 fastcgi。我在错误日志中看到很多以下错误
readv() 失败(104:连接重置 由同行)同时阅读上游和 recv() 失败(104:连接重置 由对等方)在读取响应标头时 来自上游
我认为使用该应用程序没有任何问题。这些错误是否严重或如何消除它们。
【问题讨论】:
从 nginx 版本 1.15.3 开始,您可以通过将上游的 keepalive_requests 选项设置为与 php-fpm 的 pm.max_requests 相同的数字来解决此问题:
upstream name {
...
keepalive_requests number;
...
}
如果您使用 nginx 连接到 php-fpm,一个可能的原因也可能是 nginx 的 fastcgi_keep_conn 参数设置为 on(特别是如果您的pm.max_requests 在 php-fpm 中设置):
http|server|location {
...
fastcgi_keep_conn on;
...
}
这可能会导致每次 php-fpm 的子进程重新启动时(由于达到 pm.max_requests)而 nginx 仍然连接到它时所描述的错误。要对此进行测试,请将 pm.max_requests 设置为一个非常低的数字(如 1),然后查看是否会出现更多上述错误。
修复非常简单 - 只需停用 fastcgi_keep_conn:
fastcgi_keep_conn off;
或者完全删除参数(因为默认值是off)。这确实意味着您的 nginx 将在每次请求时重新连接到 php-fpm,但如果您在同一台机器上同时拥有 nginx 和 php-fpm 并通过 unix 套接字连接,则性能影响可以忽略不计。
【讨论】:
其他人提到了fastcgi_read_timeout参数,它位于nginx.conf文件中:
http {
...
fastcgi_read_timeout 600s;
...
}
除此之外,我还必须更改文件中的 request_terminate_timeout 设置:/etc/php5/fpm/pool.d/www.conf
request_terminate_timeout = 0
信息来源(还有一些关于更改 php.ini 参数的其他建议,在某些情况下可能相关):https://ma.ttias.be/nginx-and-php-fpm-upstream-timed-out-failed-110-connection-timed-out-or-reset-by-peer-while-reading/
【讨论】:
有时会因为大量请求而发生此问题。默认情况下,php5-fpm 中的pm.max_requests 可能为 100 或以下。
要解决它,增加它的价值取决于您网站的请求,例如 500。
之后你必须重启服务
sudo service php5-fpm restart
【讨论】:
这也可能是一个非常简单的问题 - 您的代码中某处存在无限循环,或者无限尝试连接页面上的外部主机。
【讨论】:
关于这个错误:
readv() 在读取上游时失败(104:对等方重置连接),并且在从上游读取响应标头时,recv() 失败(104:对等方重置连接)
还有 1 个案例我仍然可以看到这一点。 快速设置概览:
在查看 PHP-FPM 错误日志并在 php-fpm 池配置中启用 catch_workers_output = yes 后,我发现这种情况下的根本原因实际上是 amfext 模块(PHP 模块对于闪存)。 a known bug and fix for this module 可以通过修改 amf.c 文件来纠正。
修复此 PHP 扩展问题后,上述错误不再是问题。
【讨论】:
答案#2。 有趣的是 fastcgi_read_timeout 5m;为我修复了一个虚拟主机。 但是,我仍然在另一个虚拟主机中遇到错误,只需运行 phpinfo(); 为我解决这个问题的方法是复制默认的生产 php.ini 文件并将我需要的配置添加到其中。 我所拥有的是以前 PHP 安装的 php.ini 的旧副本。 一旦我将默认的 php.ini 从“共享”放入并添加到我需要的扩展和配置中,这解决了我的问题,并且不再有 nginx 错误 readv() 和 recv() 失败。
我希望这 2 个修复中的 1 个对某人有所帮助。
【讨论】:
这是一个非常模糊的错误,因为它可能意味着一些事情。关键是查看所有可能的日志并找出答案。 就我而言,这可能有点独特,我有一个工作 nginx + php / fastcgi 配置。我想用 PHP-FPM 编译一个新的更新版本的 PHP,我这样做了。原因是我在一个无法承受停机时间的实时服务器上工作。所以我必须尽可能无缝地升级并迁移到 PHP-FPM。
因此我有 2 个 PHP 实例。
一旦我使用套接字连接而不是 TCP 在 nginx vhost 上启动 PHP-FPM (PHP 5.3.8),无论他们是否使用 FPM,我都开始在任何耗时超过 x 分钟的 fastcgi 页面上收到此上游错误。通常是在 mysql 中执行大型 SELECTS 的页面需要大约 2 分钟才能加载。我知道不好,但这是因为后端数据库设计。
我所做的修复它是在我的虚拟主机配置中添加这个: fastcgi_read_timeout 5m; 现在这也可以添加到 nginx 全局 fastcgi 设置中。这取决于您的设置。 http://wiki.nginx.org/HttpFcgiModule
【讨论】:
我在后台使用 php-fpm,在超时后慢速脚本被杀死,因为它是这样配置的。因此,超过指定时间的脚本将被终止,并且 nginx 会在连接从 php-fpm 引擎/进程关闭时报告 recv 或 readv 错误。
【讨论】: