2013-02-07 72 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