【问题标题】:Node.js / How handle connection leak?Node.js / 如何处理连接泄漏?
【发布时间】:2015-02-05 07:52:38
【问题描述】:

我在 Node.js 中编写了一个服务器应用程序。

当我执行lsof -p 10893(10893 是我的 Node.js 应用程序的 pid)时,我得到了这个:

node    10893 root   19u  IPv4 (num) 0t0    TCP ip-X.X.X.X->ip-X-X-X.X:45403 (ESTABLISHED)
node    10893 root   19u  IPv4 (num) 0t0    TCP ip-X.X.X.X->ip-X-X-X.X:58416(ESTABLISHED)

仅当我重新启动我的应用程序时,此连接被保持并且永远不会关闭。

我在 node.js 中有以下代码,据我所知,它应该可以处理这个问题:

app.use(function(err, req, res, next) {
    res.setTimeout(120000);
    res.status(500).send('Unexpected error');
});

但是这些连接仍然出现,即使在 120000 毫秒之后。

我该如何解决?

【问题讨论】:

  • 你希望完成什么?
  • @satchcoder: 这个连接将在 120000 毫秒后关闭

标签: javascript node.js


【解决方案1】:

很确定这是一个 Keep-Alive 问题。有关详细信息,请参阅this question 和它的答案,但要点是:

res.set("Connection", "close");

如果您希望所有连接都具有该行为,请将其作为中间件添加到您的路由/路由器上方:

app.use(function (req, res, next) {
    res.set("Connection", "close");
    next();
});

另外,如果你想让套接字本身超时,那就有点棘手了:

var http = require('http');
var express = require('express');

var app = express();
var svr = http.createServer(app);

svr.on('connection', function (socket) {
    socket.setTimeout(120000, function () {
        this.end();
    });
});

// other middleware / routes here

app.use(function(err, req, res, next) {
    res.status(500).send('Unexpected error');
});

svr.listen(PORT);

编辑

刚刚注意到您的函数是一个错误处理程序中间件(由于存在err 参数)。这意味着只有在出现错误时才会设置超时,而不是在请求成功完成时设置。

【讨论】:

  • 将策略从 Keep-alive 更改为 connection close 没有影响吗?
  • 会有一些后果,这取决于你的应用在做什么。客户端是浏览器吗?它是一个 API,客户端将连续向服务发出许多请求吗?在这些情况下,Keep-Alive 会更好,您可以依赖超时。
猜你喜欢
  • 2018-12-01
  • 2012-12-12
  • 2011-12-12
  • 2015-01-24
  • 2011-12-23
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多