没有Load Balancer的EC2实例上的AWS SSL - NodeJS

时间:2016-11-08 05:22:19

标签: node.js amazon-web-services ssl amazon-ec2

是否可以运行EC2实例,在没有port 443的情况下在load balancer上进行聆听?我现在正在我的Node.JS应用中尝试,但是当我使用https://调用页面时,它无效。但是,如果我将其设置为port 80,则http://一切正常。

我之前使用load balancerroute53工作了,但我不想再为ELB支付18美元/月,特别是当我只有一台服务器正在运行时。

感谢您的帮助

4 个答案:

答案 0 :(得分:8)

有可能吗?当然是。听起来你在ELB上安装了SSL证书,现在你已经删除了ELB。您现在必须在EC2服务器上安装SSL证书。没有ELB或CloudFront分配,您无法使用AWS ACM SSL证书。如果您不想为这些服务付费,您必须在其他地方获得SSL证书。

答案 1 :(得分:6)

你是对的,如果它只是一个实例而你觉得你不需要为大量的流量增加做好准备,你就不应该付钱ELB。

从高级别的角度来看,您必须完成以下步骤:

  1. 安装nginx服务器以服务于NodeJS应用程序。
  2. 在nginx服务器上安装SSL证书。

    - 手动执行此操作,ssh进入服务器并按照here所述安装证书。

    - 或者在您的应用程序中包含必要的文件(我相信这只适用于弹性beanstalk?),它会自动覆盖nginx配置文件,如here所述。

  3. 确保nginx正在侦听端口443(应该在上一步中完成)
  4. 打开与您希望流量进入服务器的位置相对应的EC2服务器安全组(端口80 /端口443)

答案 2 :(得分:0)

在我们的项目中,我们使用:

  • nginx作为负载均衡器,静态文件的代理和缓存
  • pm2作为Node.js的流程管理员
  • node.js v6.9.1作为长期支持版
  • MongoDB作为数据库
  • redis作为队列和缓存

这个东西正在t2.medium实例上运行。

您对在项目中使用nginx有何看法?

答案 3 :(得分:0)

一旦你有了证书文件,就没有那么难了。你甚至可以在没有 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)并应用重定向。然后我也为此使用端口转发。所以,我在服务文件中添加了第二个端口转发规则。