簡體   English   中英

沒有負載均衡器的 EC2 實例上的 AWS SSL - NodeJS

[英]AWS SSL on EC2 instance without Load Balancer - NodeJS

是否可以在沒有load balancer情況下運行 EC2 實例,偵聽port 443 我現在正在我的Node.JS應用程序中嘗試,但是當我使用https://調用頁面時它不起作用。 但是,如果我將其設置為port 80 ,則http://一切正常。

我早些時候使用load balancerroute53 ,但我不想再為 ELB 支付 18 美元/月,尤其是當我只有一台服務器運行時。

感謝您的幫助

有可能嗎? 是的,當然。 聽起來您在 ELB 上安裝了 SSL 證書,現在您已經刪除了 ELB。 您現在必須在 EC2 服務器上安裝 SSL 證書。 如果沒有 ELB 或 CloudFront 分配,您將無法使用 AWS ACM SSL 證書。 如果您不想為這些服務中的任何一個付費,則必須在其他地方獲得 SSL 證書。

你是對的,如果它只是一個實例並且你覺得你不需要為流量的大幅增加做好准備,那么你不應該為 ELB 付費。

從高層次的角度來看,您必須完成以下步驟:

  1. 安裝一個 nginx 服務器來為您的 NodeJS 應用程序提供服務。
  2. 在 nginx 服務器上安裝 SSL 證書。

    - 手動執行此操作,通過 ssh 連接到服務器並按照此處所述安裝證書。

    - 或者在您的應用程序中包含必要的文件(我相信這僅適用於彈性 beanstalk?),它將按照此處所述自動覆蓋 nginx 配置文件。

  3. 確保 nginx 正在監聽 443 端口(上一步應該已經完成​​了)
  4. 打開您希望流量進入服務器的位置(端口 80 / 端口 443)對應的 EC2 服務器的安全組

對於我們的項目(很像描述的其他海報),我們使用了以下設置:

  1. nginx 作為負載均衡器和代理,用於端口 80 上的所有調用(沒有直接調用 node.js 服務器在端口 3000 上對公眾關閉)
  2. pm2 作為 Node.js(和部署)的進程管理器
  3. 用於監控的 keymetrics.io
  4. Nodejs v6.9.3 boron/lts(通過 NVM)
  5. 帶有 WiredTiger 引擎的 Mongodb 3.2 (Compose.io)
  6. 用於托管的 Amazon EC2 實例(Amazon Linux 而非 Ubuntu)

這種設置對我們來說非常有效。 在這個設置中,我們可以在不使用亞馬遜負載均衡器的情況下設置 SSL。

一旦你有了你的證書文件,就沒有那么難了。 你甚至可以在沒有 Nginx 的情況下做到這一點。

讓我們首先創建一個快速的網絡服務器

const app = express();

例如,您可以將靜態網站放在文件夾中。

const wwwFolder = express.static(path.join(__dirname, '/../www'));
app.use(wwwFolder);

接下來,你基本上需要閱讀你的證書文件

const key = readFileSync(__dirname + '/ssl/privkey.pem', 'utf8');
const cert = readFileSync(__dirname + '/ssl/cert.pem', 'utf8');
const ca = readFileSync(__dirname + '/ssl/chain.pem', 'utf8');
const serverOptions: https.ServerOptions = { key, cert, ca };

最后,您使用這些證書創建一個 https 服務器。

const server = https.createServer(serverOptions, app);
server.listen(httpsPort, () => log.debug("createWebServers", `server is listening on port ${httpsPort}`));

出於安全原因,可能無法直接偵聽端口 443。相反,例如使用 4201 之類的端口,然后使用端口轉發。

如果你使用 systemd 來啟動/停止你的服務,那么這個端口轉發可以在你的服務配置文件中定義。 一個簡單的解決方案:

[Unit]
Description=my.service
After=network.target

[Service]
Type=simple
TimeoutSec=0
User=ubuntu
PermissionsStartOnly=true
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 4201
ExecStart=/usr/local/bin/node /home/ubuntu/project/server.js
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 4201
Restart=on-failure

[Install]
WantedBy=multi-user.target

有多種方法可以創建和刷新證書文件。 所以,我不會在這里詳細介紹。 但最重要的是,您不需要亞馬遜證書來完成它。 LetsEncrypt 是免費且簡單的,並且運行良好。

通常我還會添加一個 http 服務器(沒有 HTTPS)並應用重定向。 然后我也為此使用端口轉發。 因此,我在服務文件中添加了第二個端口轉發規則。

在我們的項目中我們使用:

  • nginx作為負載均衡器,代理和靜態文件的緩存
  • pm2作為Node.js的進程管理器
  • node.js v6.9.1作為長期支持版本
  • MongoDB作為數據庫
  • redis作為隊列和緩存

這個東西在t2.medium實例上運行。

您如何看待在項目中使用nginx?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM