请考虑以下事项。
let bluebird = require('bluebird');
let fs = bluebird.promisifyAll(require('fs'));
let express = require('express');
let https = require('https');
let app = express();
let eventualKeys = bluebird.all(['key', 'crt'].map(x => fs.readFileAsync("server." + x)));
let eventualCredentials = eventualKeys.then(([key, cert]) => {
return {key: key, cert: cert};
});
let eventualHttpsServer = eventualCredentials.then(credentials => https.createServer(credentials, app));
eventualHttpsServer.then(httpsServer => httpsServer.listen(4443));
如果我使用https向服务器发出请求,一切正常。
但是如果我使用http发出请求,它会无限期挂起。
显然,由于它是https服务器,因此无法处理http请求。但是有更清洁的方法来处理这个问题吗?例如,nginx回复尝试使用http来查询https端口,而不那么令人困惑"普通HTTP请求被发送到HTTPS端口"消息。
此行为是否可能导致服务器端资源泄漏?
答案 0 :(得分:1)
这会挂起,因为快速服务器没有响应客户端(因为它没有侦听端口)。由于服务器没有处理请求,它不会导致服务器上的资源泄漏,并且客户端正在等待,只要能够给服务器提供响应的机会。
如果要处理此类响应,可以设置另一个侦听http端口(80)的服务器以响应失败或重定向(301)。但是,如果您使用的是nginx或apache,建议您处理任何此类拒绝或重定向,因为它们比启动新节点http实例只是为了断开连接所需的资源更少。