node.js服务器泄漏TCP连接?

Pmarchezz

注意:请参阅文章末尾的我的编辑。

我有一个node.js(Express)服务器,它每秒大约处理15-30个请求。我正在提供一堆简单的JADE模板和一个Durandal SPA应用程序,其中大部分请求都用于简单的JADE模板。几分钟后一切正常,但是服务器在一段时间后开始出现EMFILE错误,并最终崩溃。经过一些故障排除后,我发现lsof -i -n -P | grep node一会儿之后的输出包含大量此类行:

node    8800 my_user   13u  IPv4 906628      0t0  TCP 172.x.x.x:3000->x.x.x.x:44654 (ESTABLISHED)
node    8800 my_user   14u  IPv4 908407      0t0  TCP 172.x.x.x:3000->x.x.x.x:13432 (ESTABLISHED)
node    8800 my_user   15u  IPv4 908409      0t0  TCP 172.x.x.x:3000->x.x.x.x:38814 (ESTABLISHED)
node    8800 my_user   19u  IPv4 906622      0t0  TCP 172.x.x.x:3000->x.x.x.x:56743 (ESTABLISHED)
node    8800 my_user   20u  IPv4 907221      0t0  TCP 172.x.x.x:3000->x.x.x.x:46897 (ESTABLISHED)
...

我是node.js的初学者,但似乎无法取消已经完成的连接,最终导致EMFILE并崩溃。

我已经尝试了以下方法:

  • ulimit -n 2048:这显然是一个临时解决方案,它会延迟EMFILE错误,但不能解决问题
  • 将响应超时(默认为2分钟,如果我没记错的话)降低到5-10秒

在完成这两项调整后,服务器需要更长时间才能崩溃,但最终还是会崩溃。即使没有任何负载,它似乎也无法处理“阻塞”的TCP ESTABLISHED连接,并且当请求再次开始到达时,打开的文件描述符的数量持续增长,最终使进程崩溃。

我的node.js服务器(在coffeescript中)看起来像这样(我正在使用mimosa启动服务器,但我认为这没有什么区别):

express = require 'express'
engines = require 'consolidate'

fs      = require 'fs'
http    = require 'http'
https   = require 'https'

options =
    ca: fs.readFileSync __dirname + '/ssl/ca.pem'
    key: fs.readFileSync __dirname + '/ssl/key.pem'
    cert: fs.readFileSync __dirname + '/ssl/cert.pem'

exports.startServer = (config, callback) ->

    app = express()

    app.configure ->
        app.set 'port', config.server.port
        app.set 'views', config.server.views.path
        app.engine config.server.views.extension, engines[config.server.views.compileWith]
        app.set 'view engine', config.server.views.extension
        app.use express.logger({ format: ":date :method :remote-addr :url :response-time" })
        app.use express.favicon __dirname + '/public/favicon.ico'
        app.use express.bodyParser()
        app.use express.methodOverride()
        app.use express.compress()
        app.use express.static(config.watch.compiledDir)
        app.use config.server.base, app.router

    app.configure 'development', ->
        app.use express.errorHandler()

    app.get '/my/route/n1', (req, res) ->
        res.render "./my/template/n1"
    app.get '/my/route/n2', (req, res) -> # route getting the bulk of requests
        res.setTimeout(10000) # timeout introducted attempting to fix the problem
        res.render "./my/template/n2"
    app.get '/my/route/n3', (req, res) ->
        res.render "./my/template/n3"
    app.get '*/?', (req, res) -> res.render 'index'

    server = https.createServer options, app
    server.listen config.server.port, ->
        console.log "Express server listening on port %d in %s mode", server.address().port, app.settings.env

    callback server

我认为node.js在处理此数量的请求上应该没有任何问题,所以我认为这是我的配置错误或类似的错误。我做错了什么?谢谢!

PS:我出于lsof隐私方面的考虑,从代码/输出中编辑了一堆东西,还因为它与该问题无关。但是,如果需要其他任何信息,我将更新问题以尽快提供。

编辑:我想我找到了问题的根源。Express用于提供服务的连接./my/template/n2的确在10秒后超时,但是用于express.static提供图像,css和其他静态资源的连接却没有(好,但它们需要2-5分钟才能释放其文件描述符。) )。我想我的问题然后变成:如何设置由提供的文件的响应超时express.static我尝试过使用app.use express.timeout(10000)其他所有中间件,但是它似乎只适用于主要的JADE文件,不适用于图像或CSS。

我正在使用Express3。在此先感谢您。

Pmarchezz

在每个其他app.use调用之前添加此中间件之后,该问题似乎已解决

        app.use (req, res, next) ->
            res.setTimeout(10000)
            next()

我怀疑这是解决问题的最优雅的方法,但目前效果很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过Nginx在Node.js上的服务器发送事件连接超时

来自分类Dev

无法连接到Node.js服务器

来自分类Dev

强制关闭node.js http服务器中的所有连接

来自分类Dev

Node.js-服务器关闭了连接?

来自分类Dev

在node:socket.io或net模块中创建客户端-服务器TCP连接

来自分类Dev

无法连接到Android中的Node JS服务器

来自分类Dev

从网站连接到Node.js服务器?

来自分类Dev

Node.js状态服务器

来自分类Dev

无法从Node.js连接到Telnet服务器

来自分类Dev

PHP websocket连接到node.js服务器

来自分类Dev

Node.js HTTP服务器

来自分类Dev

Node.js服务器无法检测到与Pubnub + SocketIO的连接

来自分类Dev

在我的VPS上的端口3000上运行node.js服务器,并且连接超时

来自分类Dev

如何连接到远程Node.js服务器?

来自分类Dev

Android App使用Socket.io连接到Node.js服务器

来自分类Dev

将mongo db连接到远程服务器Node.js

来自分类Dev

连接到Azure虚拟机上的Node.js服务器

来自分类Dev

使用Node.js连接到MS-SQL服务器

来自分类Dev

如何创建Node JS服务器

来自分类Dev

Socket.io Node Js服务器和React js客户端未连接

来自分类Dev

Node.js + setInterval =连接丢失:服务器关闭了连接

来自分类Dev

评估和打印数据的Node.js TCP服务器

来自分类Dev

node.js-连接列表器未在TCP服务器中执行

来自分类Dev

无法连接到Android中的Node JS服务器

来自分类Dev

Node.js HTTP服务器

来自分类Dev

我的服务器TCP(node.js)上的订单执行不正确

来自分类Dev

调用node.js服务器

来自分类Dev

Node 服务器的 Systemd 服务无法连接到 MongoDB

来自分类Dev

崩溃服务器 node.js