在内存不足之前,Express.js webserver在生产上持续5分钟

时间:2011-07-07 14:08:26

标签: node.js coffeescript express

所以我有一个Express.js服务器设置,但在生产大约5分钟后 - http://balupton.com - 它崩溃并重新启动。

我网站的源代码在这里: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

我到处都看了,但我已经放弃了。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:9)

问题原来是中间件。拥有静态中间件意味着当找不到静态文件时,静态中间件会尝试将请求发送到下一个中​​间件 - 这个中间件不存在,所以它只会让请求永远打开 - 所以非常快速地打开连接开始起来(由于蜘蛛爬行不存在的网址)并且每次资源耗尽时都会崩溃服务器。

解决方案是添加一个404中间件作为最后一个中间件运行如下:

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

这样,当静态中间件找不到文件时,它会将其发送到下一个中​​间件,最终会发送404中间件,然后发送404而不是永久保持请求打开。