我目前在nginx後面運行一系列Node.js快速應用程序。但是,雖然我已經使應用程序運行良好,但在某些情況下,我正在經歷間歇性502錯誤網關錯誤。在Nginx後面運行Express應用程序的間歇性502錯誤網關錯誤
主要實例是用戶嘗試登錄的位置。通常,第一次嘗試登錄將返回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實例,我希望能夠解決問題。
說實話我對nginx並不熟悉,但是你確實應該改變的是你的代碼有500個錯誤。 50x表示服務器損壞;如果用戶名/密碼不匹配,應該發送的內容是40x錯誤,最有可能是401表示未經授權。檢查一下,看看你的流量是否提高。 –
此外,如果您回覆自己,並且如果您不再需要答案,則將問題標記爲已回覆,而不是編輯。 –