首页 文章

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

提问于
浏览
16

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

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

我没有看到使用该应用程序的任何问题 . 这些错误是严重的还是如何摆脱它们 .

8 回答

  • 0

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

  • 0

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

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

    之后你必须重新启动服务

    sudo service php5-fpm restart
    
  • 0

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

  • 2

    关于这个错误:

    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模块(用于Flash的PHP模块) . 可以通过更改amf.c文件来更正a known bug and fix for this module .

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

  • 1

    这是一个非常模糊的错误,因为它可能意味着一些事情 . 关键是要查看所有可能的日志并弄清楚 . 在我的情况下,这可能有点独特,我有一个工作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

  • 10

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

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

  • 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/

  • 3

    如果你使用nginx连接到php-fpm,一个可能的原因也可能是将nginx' fastcgi_keep_conn 参数设置为 on (特别是如果你在php-fpm中有一个低 pm.max_requests 设置):

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

    每次php-fpm的子进程重启(由于 pm.max_requests 到达),而nginx仍然连接到它时,这可能会导致所描述的错误 . 要对此进行测试,请将 pm.max_requests 设置为a真的很低的数字(如 1 ),看看你是否得到更多的上述错误 .

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

    fastcgi_keep_conn off;
    

    或者完全删除参数(因为默认值为 off ) . 这意味着你的nginx会在每次请求时重新连接到php-fpm,但如果你在同一台机器上同时使用nginx和php-fpm并通过unix socket连接,性能影响可以忽略不计 .

相关问题