在AWS Bean秸秆部署(单服务器)上,Nginx服务器在同一主机上与NodeJS/Express服务器交谈,偶尔会抱怨上游连接丢失。
2020/03/23 10:52:43 [error] 11443#0: *70 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.46.70, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"
2020/03/23 10:52:48 [error] 11444#0: *580 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "POST /api/app/importNutriwebData HTTP/1.1", upstream: "http://172.17.0.3:33080/api/app/importNutriwebData", host: "******"
2020/03/23 10:52:50 [error] 11443#0: *526 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"这是在没有任何明显原因的情况下发生的,包括/health-check URL,这是一个非常简单的response.send("OK");。这种情况似乎发生在随机网址上。
上游172.17.0.3位于运行Nginx的同一台机器上。所有下游连接都来自CloudFront。
同样的设置在过去3-4年中运行良好,但这些错误从2-3天开始增加。我想不出任何可能已经改变的东西,除了大约10%的请求。可能有大约50个长寿的EventStream连接,但永远不会超过100个并发连接。我很确定NodeJS服务器是安全的。
我还试图升级Amazon,重新启动服务器,重建整个EBS部署--没有什么改变。
我可以对上游URL (http://172.17.0.3:33080/health-check)甚至CloudFront => Nginx公共URL运行一个没完没了的URL循环,尽管尝试了数千次请求(测试)几分钟,我还是无法重现这个问题。
服务器有大约1.5G的RAM空闲,CPU大约80%空闲。
在我看来,打开的文件句柄很低:
$ for pid in $(pidof nginx) ; do sudo ls /proc/$pid/fd | wc -w ; done
130
169
11
$ for pid in $(pidof node) ; do sudo ls /proc/$pid/fd | wc -w ; done
146Nginx会不会耗尽某种资源?是时间问题吗?我能做些什么来进一步调试它呢?
任何帮助都非常感谢。
发布于 2020-03-24 09:48:40
看起来你的NodeJS应用程序正出于某种原因向nginx发送RST数据包。您可以在错误发生时尝试tcpdump和/或strace来捕获网络流量和系统;然后调查是否有什么奇怪的事情发生。
这个资源可能很有用,它似乎描述了一个与keepalive超时有关的非常类似的问题:http://theantway.com/2017/11/analyze-connection-reset-error-in-nginx-upstream-with-keep-alive-enabled
https://serverfault.com/questions/1007979
复制相似问题