2011-07-07 21 views
2

因此,我已經安裝了Express.js服務器,但生產後大約5分鐘後 - http://balupton.com - 它崩潰並重新啓動。Express.js網絡服務器在內存耗盡之前會持續5分鐘

我的網站的源代碼是在這裏:https://github.com/balupton/balupton.docpad/blob/master/server.coffee

的docpad參考,使用它來創建服務器是在這裏: https://github.com/bevry/docpad/blob/master/lib/docpad.coffee#L589

它託管在http://no.de這裏是內存溢出異常,保持出現在每5分鐘左右的日誌:

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 
[ Jul 7 14:02:13 Stopping because all processes in service exited. ] 
[ Jul 7 14:02:13 Executing stop method (:kill). ] 
[ Jul 7 14:02:13 Executing start method ("env `cat /home/node/node-service/profile` /opt/nodejs/latest/bin/node /home/node/node-service/releases/20110707135409/server.js &"). ] 
[ Jul 7 14:02:13 Method "start" exited with status 0. ] 
Express server listening on port 80 and directory /home/node/node-service/releases/20110707135409/out

我到處看着這個,但我已經放棄了。誰能幫我?

回答

9

問題原來是與中間件。持續使用靜態中間件意味着當沒有找到靜態文件時,靜態中間件會嘗試將請求發送到下一個中​​間件 - 該中間件不存在,所以它只會保持請求永遠打開 - 所以非常快速地打開連接(由於蜘蛛抓取不存在的網址),並且每次資源耗盡時都會使服務器崩潰。

解決的辦法是增加一個404中間件作爲最後的中間件,像這樣運行:

# 404 Middleware 
myServerInstance.use (req,res,next) -> 
    res.send(404) 

這樣,當靜態中間件沒有找到一個文件,它把它發送到下一個中​​間件,最終404中間件將被擊中,並且發送404而不是永遠保持請求打開。

相關問題