Node.js 间歇性502网关错误(使用nginx、nodejs、mongodb)

Node.js 间歇性502网关错误(使用nginx、nodejs、mongodb),node.js,express,nginx,Node.js,Express,Nginx,我们正在使用nodejs(v0.10.29)、express、nginx(版本1.4.6)和mongodb(v2.6.3)复制集,并获得间歇性502坏网关错误。虽然显示nginx aerror.log,但pm2日志无法记录错误 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: somedoma

我们正在使用nodejs(v0.10.29)、express、nginx(版本1.4.6)和mongodb(v2.6.3)复制集,并获得间歇性502坏网关错误。虽然显示nginx aerror.log,但pm2日志无法记录错误

recv() failed (104: Connection reset by peer) while reading response header from     upstream, client: xxx.xxx.xxx.xxx, server: somedomain.com, request: "GET /img/abc.png HTTP/1.1", upstream: "http://127.0.0.1:3000/img/abc.png", host: "domain.com", referrer: "http://domain.com/admin/"
access.log的意思是:

"GET /url/abc.html HTTP/1.1" 502 723 "http://domain.com/admin/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36"

有谁能告诉我这个问题吗?

这可能不是nginx本身的问题,而是nodejs的问题。502坏网关错误意味着nginx向nodejs服务器询问一些信息,nodejs服务器回答后“立即挂断电话”。“挂断电话”更多的是指消息中的“对等方重置连接”部分

现在,这可能表明了许多不同的问题,所以我不能给你一个明确的答案

可能是在处理请求时出现了实际错误,这需要通过js代码跟踪错误

这可能是内存问题(内存使用情况如何)

或者,这可能是节点的超时错误,因为返回答案花费的时间太长,或者因为代码有错误,或者因为系统内存不足

我知道我过去常常在nginx和phpfpm之间出现间歇性超时错误,因为nginx会放弃等待php。我调整了内存使用和超时设置来解决这个问题(并且优化了php代码)


如果您可以提供有关节点或应用程序的内存/负载使用情况或日志的更具体信息,甚至是502错误中的一般模式(是否定位到某个地理区域、浏览器或操作系统?),那么答案可能就不那么具有推测性了。

在服务器到服务器的连接中,我就遇到了这种情况。服务器正在向一包300-400发子弹射击,如:

get http://example.com/?a=1&b=2&c=3
第二个人无法及时回复,放弃了说
502


我找到的解决方案是将请求一个接一个地分块发送。

在我们的例子中,nginx位于Node.js之上,Node.js由Forever自动启动。由于Redis数据库内容出错,节点服务器间歇性崩溃,nginx返回502或503错误。我们花了一些时间才找到原因,因为节点的崩溃消息是由Forever记录的


因此,nginx或其配置没有故障,节点服务器(及其后台服务)是源。

您是否尝试过使用pm2进行w/o操作?这种情况多久发生一次,你有更多的信息吗?这是一个很好的答案!有没有更好的方法来调试这样的问题?我注意到nginx日志非常不具描述性,并没有真正指出一个明确的问题。@Jordan“像这样的调试问题更好”是什么意思?问题出在节点代码中的某个地方,因此您必须跟踪代码以查看它失败的地方。在我的脑海中,我不熟悉可以帮助跟踪的包。您总是可以通过代码输入额外的日志语句来找出进程停止的位置,这是一种乏味、烦人但可靠的方法。如果这是一个内存问题,那么你可以查看内存使用情况,看看它是否达到上限。您可以尝试增加nginx的等待时间,看看这是否能让事情顺利进行。我也有类似的问题,但在ASP.NET Core中-我没有为docker映像分配足够的内存,它的内存正在耗尽,因此请求正在终止,nginx报告502。谢谢放置一些警报(如使用cloud watch)也可能有助于发现问题,例如,如果问题发生在cloudwatch图形显示内存或CPU高的同时,则可以通过这种方式检测问题