HTTP 连接在 Amazon EC2 上托管的 nodejs 应用程序中过早终止

Posted

技术标签:

【中文标题】HTTP 连接在 Amazon EC2 上托管的 nodejs 应用程序中过早终止【英文标题】:HTTP connection gets prematurely terminated in nodejs app hosted on Amazon EC2 【发布时间】:2017-11-28 15:10:45 【问题描述】:

我有一个托管在 Amazon EC2 上的 REST api,它是用 Nodejs (Express) 编写的。

在特定的 REST 调用中,大约 5MB 的回复被发送到客户端。在客户端完全收到回复之前,客户端会打印以下错误消息。

Premature end of Content-Length delimited message body

我在 nodejs 服务器中添加了一个连接侦听器,如下所示,以检查服务器上发生了什么。

var app = express();

var server = http.createServer(app);
var port = app.get('port');
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
server.on('connection', function (socket) 
    log.debug('SOCKET OPENED' + JSON.stringify(socket.address()));
    socket.setTimeout(300000);   //5 minute timeout
    socket.on('end', function () 
        log.debug('SOCKET END: other end of the socket sends a FIN packet');
    );

    socket.on('timeout', function () 
        log.warn('SOCKET TIMEOUT');
    );

    socket.on('error', function (error) 
        log.warn('SOCKET ERROR: ' + JSON.stringify(error));
    );

    socket.on('close', function (had_error) 
        log.debug('SOCKET CLOSED. IT WAS ERROR: ' + had_error);
    );
);

我观察到SOCKET TIMEOUT 已登录后端。在上面的代码中,我将socket超时时间增加到了5分钟,但似乎没有任何效果。

早些时候我在 Google 计算引擎中托管了 REST API,当时我没有遇到这个问题。

这可能是什么问题?

编辑:这是 REST API 调用的代码。

我的app.js中有以下代码

require('./routes/index')(app);

下面是routes目录的index.js。

var changeCase = require('change-case');
var express = require('express');
var routes = require('require-dir')();

module.exports = function (app) 
    Object.keys(routes).forEach(function (routeName) 
        var router = express.Router();
        require('./' + routeName)(router);
        app.use('/api/' + changeCase.paramCase(routeName), router);
    );
;

可以看出,它循环遍历routes目录下的所有js文件,并将文件名注册为app中的URL路径。

这是我遇到此问题的特定路线的代码。

   module.exports = function (router)    
       router.get("/fetch", function (req, res, next) 
            itemModel.fetch(req.user.clientId, function (error, items) 
                if (error) 
                    res.status(500).json(error: error);
                 else 
                    res.json(items);    //items is a JSON array
                
            );
        );
    

【问题讨论】:

那么:REST API 在哪里?我只能看到一些 WebSocket 代码;)另外:你如何发送/接收数据?另外:您使用的是哪个 WebSocket 实现? @jsalonen,更新问题 是的。两者都存在问题。 从 mongodb 获取文档需要很短的时间(大约 1 秒)。大约 20 秒后,客户端报告服务器终止了连接(它大约收到了大约 1MB 的回复)。 @jsalonen,为 http 服务器设置超时就可以了 【参考方案1】:

为 HTTP 服务器设置超时解决了这个问题。

var server = http.createServer(app);
var port = app.get('port');
server.listen(port);
server.setTimeout(300000, function (socket) 
);

【讨论】:

以上是关于HTTP 连接在 Amazon EC2 上托管的 nodejs 应用程序中过早终止的主要内容,如果未能解决你的问题,请参考以下文章

使用我的R管道工程API在EC2实例上托管的连接问题

将 iOS 应用程序连接到 Amazon 上托管的 Ejabberd 服务器

在 ec2 上托管的 apache spark 中使用 AWS EMRFS

如何为 AWS EC2 上托管的 Parse 服务器获取 APP_ID 和 CLIENT_KEY

在 Amazon 的 EC2 上托管 Rails 应用程序的典型工具和资源是啥?

在 AWS 上托管多个网站 - Amazon Linux EC2