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

ajsxfq5m  于 12个月前  发布在  Nginx
关注(0)|答案(9)|浏览(194)

我沿着使用nginx和fastcgi。
当阅读上游时readv()失败(104:由对等端重置连接),当从上游阅读响应报头时recv()失败(104:由对等端重置连接
我没有看到任何问题使用的应用程序。这些错误是否严重或如何摆脱他们。

cfh9epnr

cfh9epnr1#

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

nfeuvbwi

nfeuvbwi2#

更新:

从nginx版本1.15.3开始,你可以通过将上游的keepalive_requests选项设置为与php-fpm的pm.max_requests相同的数字来解决这个问题:

upstream name {
    ...
    keepalive_requests number;
    ...
}

字符串

原始答案:

如果您使用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设置为一个非常低的数字(如1),看看是否会出现更多的上述错误。
修复非常简单-只需停用fastcgi_keep_conn

fastcgi_keep_conn off;


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

0s7z1bwu

0s7z1bwu3#

关于这个错误:
当阅读上游时readv()失败(104:由对等端重置连接),当从上游阅读响应报头时recv()失败(104:由对等端重置连接
还有1个案例,我仍然可以看到这一点。快速设置概述:

  • CentOS 5.5
  • PHP with PHP-FPM 5.3.8(使用一些第三方模块从头开始编译)
  • 简体中文

在查看了PHP-FPM错误日志并在php-fpm池配置中启用catch_workers_output = yes之后,我发现这种情况下的根本原因实际上是amfext模块(Flash的PHP模块)。
在修复了这个PHP扩展问题之后,上面的错误不再是一个问题。

xxe27gdn

xxe27gdn4#

这是一个非常模糊的错误,因为它可能意味着几件事。关键是要查看所有可能的日志并找出它。在我的情况下,这可能有点独特,我有一个工作nginx + php / fastcgi配置.我想编译一个新的更新版本的PHP与PHP-FPM和我都这么做了,原因是我在一个实时服务器上工作,不能承受停机时间,所以我必须升级并尽可能无缝地迁移到PHP-FPM。
所以我有两个PHP示例。

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

一旦我在nginx vhost上使用套接字连接而不是TCP启动PHP-FPM(PHP 5.3.8),我开始在任何fastcgi页面上获得此上游错误,无论他们是否使用FPM,都需要超过x分钟。通常情况下,在mysql中执行大型SELECT的页面需要大约2分钟加载。我知道这很糟糕,但这是因为后端DB设计。
我所做的就是在我的vhost配置中添加这个:**fastcgi_read_timeout 5 m;**现在这也可以添加到nginx全局fastcgi设置中。这取决于你的设置。http://wiki.nginx.org/HttpFcgiModule

aor9mmx1

aor9mmx15#

答案#2.有趣的是fastcgi_read_timeout 5 m;为我修复了一个vhost。然而,我仍然在另一个vhost中得到错误,只需运行phpinfo();对我来说,解决这个问题的方法是复制一个默认的生产php.ini文件,并将我需要的配置添加到其中。我所拥有的是以前PHP安装中的php.ini的旧副本。只是添加了我需要的扩展和配置,这解决了我的问题,我不再有nginx错误readv()和recv()失败。
我希望这两个补丁中的一个能帮助到别人。

mo49yndu

mo49yndu6#

它也可以是一个非常简单的问题-在您的代码中的某个地方有一个无限循环,或者一个无限试图连接您的页面上的外部主机。

vatpfxk5

vatpfxk57#

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

eeq64g8w

eeq64g8w8#

有时这个问题是因为请求太多而发生的。默认情况下,php5-fpm中的pm.max_requests可能是100或更低。
要解决它增加其价值取决于您的网站的要求,例如500.
之后,您必须重新启动服务

sudo service php5-fpm restart

字符串

mepcadol

mepcadol9#

我也遇到了同样的问题。我还检查了/var/log/php8.1-fpm.log,发现:

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

字符串
所以我增加了pm. max_children和pm. max_requests:

pm.max_children = 50
pm.max_requests = 500


这很有帮助!

相关问题