2013-10-22 25 views
4

我目前在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的細節和有效的請求低於:

502 Valid request

編輯

我失蹤的一點是,我使用https://github.com/nodejitsu/forever保持應用運行在發生事故時。檢查Forever日誌後,問題變得很明顯,連接到MongoDB數據庫失敗導致應用程序崩潰。此錯誤未在應用程序中捕獲,因此,據我瞭解,在Express日誌中未引用該錯誤。現在已經得到解決,再加上我已經轉向另一個MongoDB實例,我希望能夠解決問題。

+1

說實話我對nginx並不熟悉,但是你確實應該改變的是你的代碼有500個錯誤。 50x表示服務器損壞;如果用戶名/密碼不匹配,應該發送的內容是40x錯誤,最有可能是401表示未經授權。檢查一下,看看你的流量是否提高。 –

+1

此外,如果您回覆自己,並且如果您不再需要答案,則將問題標記爲已回覆,而不是編輯。 –

回答

3

我相信我發現了這個問題,即由於貓鼬無法連接到MongoDB實例導致未捕獲的錯誤。我現在處理了錯誤,並將數據庫切換到不同的實例。觸摸木材,目前我沒有任何進一步的問題。

+0

今天有同樣的問題 – irok

相關問題