我使用nginx和fastcgi。我在错误日志中看到了很多以下错误
readv()失败(104:连接重置 在阅读上游和 recv()失败(104:连接重置 通过对等)读取响应头 来自上游
我发现使用该应用程序没有任何问题。这些错误是否严重或如何摆脱它们。
答案 0 :(得分:11)
我在后台使用php-fpm,并且缓慢的脚本在超时之后被杀死,因为它是以这种方式配置的。因此,当从php-fpm引擎/进程关闭连接时,超过指定时间的脚本将被终止并且nginx将报告recv或readv错误。
答案 1 :(得分:4)
关于此错误:
readv()失败(104:通过对等方连接重置),同时读取上游和recv()失败(104:连接重置连接),同时从上游读取响应标头
还有一个案例,我仍然可以看到这一点。 快速设置概述:
在查看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实例。
一旦我使用套接字连接而不是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/