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

ram*_*mpr 20 fastcgi nginx

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

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

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

ram*_*mpr 11

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

  • 您是否找到过真正从中获取 PHP 错误日志或消息的方法? (2认同)

小智 5

关于这个错误:

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

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

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

在查看 PHP-FPM 错误日志并在 php-fpm 池配置中启用catch_workers_output = yes后,我发现这种情况的根本原因实际上是 amfext 模块(Flash 的 PHP 模块)。该模块有一个已知的错误和修复,可以通过更改 amf.c 文件来纠正。

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


Fox*_*cho 5

更新:

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

upstream name {
    ...
    keepalive_requests number;
    ...
}
Run Code Online (Sandbox Code Playgroud)


原答案:

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

http|server|location {
    ...
    fastcgi_keep_conn on;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

修复很简单 - 只需停用fastcgi_keep_conn

fastcgi_keep_conn off;
Run Code Online (Sandbox Code Playgroud)

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