nginx错误readv()和recv()失败

时间:2009-11-14 04:44:09

标签: nginx fastcgi

我使用nginx和fastcgi。我在错误日志中看到了很多以下错误

  

readv()失败(104:连接重置   在阅读上游和   recv()失败(104:连接重置   通过对等)读取响应头   来自上游

我发现使用该应用程序没有任何问题。这些错误是否严重或如何摆脱它们。

8 个答案:

答案 0 :(得分:11)

我在后台使用php-fpm,并且缓慢的脚本在超时之后被杀死,因为它是以这种方式配置的。因此,当从php-fpm引擎/进程关闭连接时,超过指定时间的脚本将被终止并且nginx将报告recv或readv错误。

答案 1 :(得分:4)

关于此错误:

  

readv()失败(104:通过对等方连接重置),同时读取上游和recv()失败(104:连接重置连接),同时从上游读取响应标头

还有一个案例,我仍然可以看到这一点。 快速设置概述:

  • CentOS 5.5
  • PHP with PHP-FPM 5.3.8(从头开始与一些第三方编译 模块)
  • Nginx 1.0.5

在查看PHP-FPM错误日志并在php-fpm池配置中启用 catch_workers_output = yes 之后,我发现在这种情况下的根本原因实际上是amfext模块(PHP模块)对于Flash)。 可以通过更改amf.c文件来纠正a known bug and fix for this module

修复此PHP扩展问题后,上述错误不再是问题。

答案 2 :(得分:3)

这是一个非常模糊的错误,因为它可能意味着一些事情。关键是要查看所有可能的日志并弄清楚。 在我的情况下,这可能有点独特,我有一个工作nginx + php / fastcgi配置。我想用PHP-FPM编译一个新的PHP更新版本,我这样做了。原因是我正在使用无法承受停机时间的实时服务器。所以我必须尽可能无缝地升级并转移到PHP-FPM。

因此我有2个PHP实例。

  • 1直接与fastcgi交谈(PHP 5.3.4) - 使用TCP / 127.0.0.1:9000(PHP 5.3.4)
  • 1使用PHP-FPM配置 - 使用Unix套接字 - unix:/ dir / to / socket-fpm (PHP 5.3.8)

一旦我使用套接字连接而不是TCP在nginx vhost上启动PHP-FPM(PHP 5.3.8),我开始在任何fastcgi页面上获取此上游错误的时间超过x分钟,无论他们是否使用FPM。通常情况下,在mysql中执行大型SELECTS的页面需要大约2分钟才能加载。我不知道,但这是因为后端数据库设计。

我做的修复是在我的vhost配置中添加: fastcgi_read_timeout 5m; 现在,这也可以添加到nginx全局fastcgi设置中。这取决于你的设置。 http://wiki.nginx.org/HttpFcgiModule

答案 3 :(得分:1)

回答#2。 有趣的是fastcgi_read_timeout足够5m;为我修好了一个vhost。 但是我只是通过运行phpinfo()来获取另一个vhost中的错误; 解决这个问题的方法是复制一个默认的生产php.ini文件并将我需要的配置添加到其中。 我所拥有的是以前PHP安装中我的php.ini的旧副本。 一旦我将默认的php.ini从'shared'中添加并添加到我需要的扩展和配置中,这解决了我的问题,我不再有nginx错误readv()和recv()失败。

我希望这两个修复中的一个可以帮助某人。

答案 4 :(得分:1)

如果您正在使用nginx连接到php-fpm,则可能的一个原因也可能是将nginx的 fastcgi_keep_conn 参数设置为 on (尤其是当php-fpm中的 pm.max_requests 设置):

http|server|location {
    ...
    fastcgi_keep_conn on;
    ...
}

这可能会在nginx仍连接到php-fpm的子进程每次重新启动时(由于达到 pm.max_requests )而导致所描述的错误。要对此进行测试,请将 pm.max_requests 设置为一个非常低的数字(例如 1 ),然后查看是否还会出现上述错误。

修复非常简单-只需停用 fastcgi_keep_conn

fastcgi_keep_conn off;

或完全删除该参数(因为默认值为 off )。这确实意味着您的nginx将在每次请求时重新连接到php-fpm,但是如果您在同一台计算机上同时拥有nginx和php-fpm并通过unix套接字进行连接,则对性能的影响可以忽略不计。

答案 5 :(得分:0)

此外,它可能是一个非常简单的问题 - 您的代码中某处存在无限字符,或无限尝试连接页面上的外部主机。

答案 6 :(得分:0)

有时候因为大量请求而发生此问题。默认情况下,php5-fpm中的pm.max_requests可能是100或更低。

要解决此问题,请根据您网站的要求增加其值,例如500。

在您必须重新启动服务之后

sudo service php5-fpm restart

答案 7 :(得分:0)

其他人提到 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/