间歇性的502坏网关错误(使用nginx,nodejs,mongodb)

10

我们正在使用nodejs(v 0.10.29)、express、nginx(版本1.4.6)和mongodb(v 2.6.3)副本集,但会不时出现502错误。尽管nginx的error.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"

有人能指导我解决这个问题吗?


1
你尝试过不使用pm2吗?这种情况有多频繁?你有更多的信息吗? - Matej
3个回答

14
可能不是nginx的问题,而更可能是nodejs的问题。502坏网关错误意味着nginx向nodejs服务器请求某些信息,然后nodejs服务器回答并“立即挂断电话”。"挂断电话"更多地是指消息中的"连接被对等方重置"部分。
现在,这可能预示着许多不同的问题,所以我不能给你一个明确的答案。
可能存在实际处理请求时出现错误的情况,这将需要跟踪js代码中的错误。
这可能是一个内存问题(您的内存使用情况如何)?
或者,这可能是node的超时错误,因为它花费太长时间返回答案,或者因为代码有问题,或者因为系统内存不足。
我知道我曾经在nginx和php-fpm之间遇到过间歇性的超时错误,因为nginx会放弃等待php。我调整了内存使用量和超时设置来解决这个问题(并优化了php代码)。
如果您可以提供有关内存/负载使用情况的更具体信息,或来自节点、应用程序日志甚至是502错误的一般模式(是否局限于特定地理区域、浏览器、操作系统),那么答案可能会更少地进行推测。

这是一个很好的答案!有没有更好的方法来调试这样的问题?我注意到nginx日志非常不具描述性,也没有明确指出问题。 - jordan
@Jordan,“debug issues like this better”是什么意思?问题在节点代码中的某个地方,因此您必须跟踪代码以查看其失败的位置。我并不熟悉可以帮助追踪的包。您可以始终通过在代码中添加额外的日志语句来找出进程停止的位置,这很繁琐但可靠。如果是内存问题,那么您可以查看内存使用情况,并查看是否达到上限。您可以尝试增加nginx的等待时间,看看是否可以解决问题。 - Shawn Patrick Rice
我曾经遇到过类似的问题,但是是在ASP.NET Core中——我的Docker镜像没有分配足够的内存,导致请求失败并且Nginx报告502错误。谢谢! - marcusturewicz
添加一些警报,例如使用 CloudWatch,可以帮助发现问题。这样,如果出现问题时与 CloudWatch 图表显示高内存或 CPU 使用率的时间相同,则可以检测到问题。 - Shobhit Mishra

2
在我们的案例中,nginx在Node.js之上,Node.js由Forever自动启动。由于Redis数据库内容存在错误,节点服务器会间歇性地崩溃,nginx返回502或503错误。找到原因花费了我们一些时间,因为只有Forever记录了Node的崩溃信息。 所以,nginx或其配置并没有失败,节点服务器(及其后台服务)是问题源头。

1

这件事情发生在我的服务器与另一个服务器之间的连接中。Node.js 服务器向 Nginx 发射了一个包含300-400颗子弹的数据包,就像这样:

get http://example.com/?a=1&b=2&c=3

第二个人无法及时做出回应,只能放弃并返回了“502”错误代码。 我的解决方案是分批发送请求,逐一处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接