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



我们正在使用nodejs(v 0.10.29),express,nginx(版本1.4.6)与mongodb(v 2.6.3)复制集,并获得间歇性502坏网关错误。Pm2日志无法记录错误,尽管nginx的error.log显示

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和php-fpm之间得到间歇性超时错误,因为nginx会放弃等待php。我调整了内存使用和超时设置来解决这个问题(并且我优化了php代码)。

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

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

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

我在服务器到服务器的连接中遇到了这种情况。Node.js服务器向Nginx发射了300-400发子弹,比如:

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

第二个不能及时回应,放弃了说502

我想到的解决办法是把请求一个一个地分成小块发送。

最新更新