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 应用程序中过早终止的主要内容,如果未能解决你的问题,请参考以下文章
将 iOS 应用程序连接到 Amazon 上托管的 Ejabberd 服务器
在 ec2 上托管的 apache spark 中使用 AWS EMRFS
如何为 AWS EC2 上托管的 Parse 服务器获取 APP_ID 和 CLIENT_KEY