2013-02-07 50 views
3

所以说我有承载如问题描述既是一个HTTP和HTTPS服务器的nod​​e.js应用程序:How to force SSL/https in Express.jsnode.js托管SSL?

在我的代码,我有以下几点:

// General configuration settings for production usage 
app.configure(function() { 
    app.set('port', process.env.PORT || 3000); 
    app.set('sslport', process.env.SSLPORT || 4000); 
    ... 
} 

http.createServer(app).listen(app.get('port'), function() { 
    winston.info('Express server listening on port ' + app.get('port')); 
}); 

var options = { 
    key: fs.readFileSync('key.pem'), 
    cert: fs.readFileSync('cert.pem') 
}; 

https.createServer(options, app).listen(app.get('sslport'), function() { 
    winston.info('Express server listening on port ' + app.get('sslport')); 
}); 

这对于工作完全正常本地运行的节点服务器。

不过,我想我的网站发布到像Azure网站,Heroku的,Nodejitsu等

所有云主机的云托管提供商似乎设置process.env.PORT值,但只有一个。当我的HTTPS服务器被创建时,这通常会导致应用程序崩溃,因为端口已被使用/访问被拒绝等。

那么,如何创建/托管一个只有一个端口的安全登录页面与!一起工作?

+0

你是说你只能听一个端口?你想要在该端口上的普通和ssl连接? –

+0

@TarandeepGill我* *正在监听代码中的两个端口,但在Azure上我只分配了一个端口,所以第二个https服务器创建调用失败。 – Siyfion

回答

7

如果您使用Heroku,则无需在nodejs中指定端口即可获得SSL。所有你需要做的就是在http请求上监听heroku PORT环境变量。一旦上传到heroku,您可以使用https(在443)或http(在端口80)上的地址来访问您的heroku应用程序。 Heroku路由到您的服务器。

同样,如果对EC2使用弹性负载平衡,则可以在负载平衡器上使用SSL终止,并再次使用http路由到侦听端口80的节点服务器。 http://aws.amazon.com/elasticloadbalancing

在这两种情况下,您都可以根据自己的需要使用自签名或正确的SSL证书。

+1

嗯,在Heroku上,我实际上只需要在我的代码中使用一个http服务器,它会同时获取http和https请求? SSL证书如何通过管道传输? – Siyfion

+0

对于那些想知道微软Azure的人来说,同样适用。一个http服务器将处理HTTP和HTTPS请求。 :) – Siyfion