我目前正在运行nginx背后的一系列Node.js表达应用程序。然而,虽然我的应用程序运行正常,但我在某些情况下遇到间歇性的502 Bad Gateway错误。
主要实例是用户尝试登录的位置。通常第一次登录尝试将返回502错误(此错误将是即时的而不是在延迟之后发生),而此后的第二次尝试将处理正常,而请求标头中没有任何更改。
我已经检查了nginx和express的日志,并且看起来在第一个实例中尽管细节相同,但是第一次尝试返回500错误(如在登录尝试错误的情况下计划的那样)。然后,这会在nginx中触发502错误。
Nginx错误日志:
2013/10/21 19:32:57 [error] 8178#0: *32101 upstream prematurely closed connection while reading response header from upstream, client: 82.40.77.228, server: instok.net, request: "POST /login HTTP/1.1", upstream: "https://127.0.0.1:5001/login", host: "instok.net", referrer: "https://instok.net/"
Nginx访问日志:
- [21/Oct/2013:19:32:57 +0000] "POST /login HTTP/1.1" 502 172 "https://instok.net/" "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0" "-"82.40.77.228 -
- [21/Oct/2013:19:32:59 +0000] "POST /login HTTP/1.1" 200 5 "https://instok.net/" "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0" "-"82.40.77.228 -
快速访问日志:
- [Mon, 21 Oct 2013 19:32:57 GMT] \"POST /login HTTP/1.0\" 500 69 \"https://instok.net/\"
- [Mon, 21 Oct 2013 19:32:59 GMT] \"POST /login HTTP/1.0\" 200 - \"https://instok.net/\"
服务器端身份验证
function authenticate(name, pass, fn) {
User.findOne({_id: name}, function(err, user) {
if (!user) { return fn(new Error("Cannot find user"))};
bcrypt.compare(pass, user.hash, function(err, res){
if (err || !res) { return fn(err) }
else {
return fn(null, user);
}
})
})
}
exports.logIn = function(req, res){
authenticate(req.body.username, req.body.password, function(err, user){
if (user){
req.session.regenerate(function(){
req.session.user = user;
res.status(200).send();
})
}
else {
res.status(500).send({message: "Error with username or password - please try again"})
}
});
}
我的nginx.conf文件的相关部分位于https://gist.github.com/grabbeh/6721046,我还使用同一个文件运行其他几个node.js应用程序。
在客户端,我使用Angular.js和$ http.post将登录详细信息发送到服务器,条件处理取决于是否从服务器发回200或500错误。
我还使用routeChangeError事件从服务器重定向500错误,以重定向到登录页面,在登录页面中尝试在登录之外访问路由。但是,我不认为客户端处理是相关的,因为在任何客户端处理之前返回错误。
很可能有更好的处理身份验证的方法,这当然可以解决上述问题,但是目前我想要了解间歇性502错误的底部。
错误确实似乎来自Express返回500,它应该返回200,但我无法识别问题,尽管玩弄代码。我们将非常感激地收到任何意见。应用程序本身在https://instok.net
运行,可以查看所有客户端代码。
出于兴趣,502和有效请求的详细信息如下:
修改
我缺少的一点是我使用https://github.com/nodejitsu/forever来保持应用程序在崩溃时运行。在检查了Forever日志后,很明显问题是连接到MongoDB数据库失败导致应用程序崩溃。此错误未在应用程序中捕获,因此,据我所知,Express日志中未引用该错误。现在已经解决了这个问题,而且我已经切换到另一个MongoDB实例,希望能解决这个问题。
答案 0 :(得分:3)
我相信我发现了一个问题,即由于mongoose无法连接到MongoDB实例而导致未被捕获的错误。我现在已经处理了错误并将数据库切换到另一个实例。触摸木材,我目前没有任何进一步的问题。