【问题标题】:nginx errors readv() and recv() failednginx 错误 readv() 和 recv() 失败
【发布时间】:2010-12-16 12:57:48
【问题描述】:

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

readv() 失败(104:连接重置 由同行)同时阅读上游和 recv() 失败(104:连接重置 由对等方)在读取响应标头时 来自上游

我认为使用该应用程序没有任何问题。这些错误是否严重或如何消除它们。

【问题讨论】:

    标签: nginx fastcgi


    【解决方案1】:

    更新:

    从 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 套接字连接,则性能影响可以忽略不计。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        要解决它,增加它的价值取决于您网站的请求,例如 500。

        之后你必须重启服务

        sudo service php5-fpm restart
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            关于这个错误:

            readv() 在读取上游时失败(104:对等方重置连接),并且在从上游读取响应标头时,recv() 失败(104:对等方重置连接)

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

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

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

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

            【讨论】:

              【解决方案6】:

              答案#2。 有趣的是 fastcgi_read_timeout 5m;为我修复了一个虚拟主机。 但是,我仍然在另一个虚拟主机中遇到错误,只需运行 phpinfo(); 为我解决这个问题的方法是复制默认的生产 php.ini 文件并将我需要的配置添加到其中。 我所拥有的是以前 PHP 安装的 php.ini 的旧副本。 一旦我将默认的 php.ini 从“共享”放入并添加到我需要的扩展和配置中,这解决了我的问题,并且不再有 nginx 错误 readv() 和 recv() 失败。

              我希望这 2 个修复中的 1 个对某人有所帮助。

              【讨论】:

                【解决方案7】:

                这是一个非常模糊的错误,因为它可能意味着一些事情。关键是查看所有可能的日志并找出答案。 就我而言,这可能有点独特,我有一个工作 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),无论他们是否使用 FPM,我都开始在任何耗时超过 x 分钟的 fastcgi 页面上收到此上游错误。通常是在 mysql 中执行大型 SELECTS 的页面需要大约 2 分钟才能加载。我知道不好,但这是因为后端数据库设计。

                我所做的修复它是在我的虚拟主机配置中添加这个: fastcgi_read_timeout 5m; 现在这也可以添加到 nginx 全局 fastcgi 设置中。这取决于您的设置。 http://wiki.nginx.org/HttpFcgiModule

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                  • 你有没有找到一种方法来实际获取 PHP 错误日志或消息?
                  • 是的 php-fpm-slow 日志。要启用此日志,您应该配置 php-fpm.conf
                  猜你喜欢
                  • 2021-11-23
                  • 2013-03-28
                  • 2017-05-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-12
                  • 2012-02-20
                  • 2018-06-10
                  相关资源
                  最近更新 更多