Node.js 不带负载平衡器的EC2实例上的AWS SSL-NodeJS

Node.js 不带负载平衡器的EC2实例上的AWS SSL-NodeJS,node.js,amazon-web-services,ssl,amazon-ec2,Node.js,Amazon Web Services,Ssl,Amazon Ec2,在没有负载平衡器的情况下,是否可以让EC2实例在端口443上运行、侦听?我现在正在我的Node.JS应用程序中尝试,但是当我使用https://调用页面时,它不起作用。但是,如果我将其设置为端口80,那么http://一切都可以正常工作 我之前使用的是负载平衡器和路由53,但我不想再为ELB支付18美元/月,尤其是当我只有一台服务器在运行时 谢谢你的帮助可能吗?当然可以。听起来您在ELB上安装了SSL证书,现在您已经删除了ELB。您现在必须在EC2服务器上安装SSL证书。如果没有ELB或Clou

在没有负载平衡器的情况下,是否可以让EC2实例在
端口443
上运行、侦听?我现在正在我的
Node.JS
应用程序中尝试,但是当我使用
https://
调用页面时,它不起作用。但是,如果我将其设置为
端口80
,那么
http://
一切都可以正常工作

我之前使用的是
负载平衡器
路由53
,但我不想再为ELB支付18美元/月,尤其是当我只有一台服务器在运行时


谢谢你的帮助

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

您是对的,如果这只是一个实例,并且您觉得不需要为流量的大幅增加做好准备,那么您不应该为ELB付费

从高层次的角度来看,您必须经历以下步骤:

  • 安装nginx服务器为NodeJS应用程序提供服务
  • 在nginx服务器上安装SSL证书

    --或者手动执行此操作,通过ssh连接到服务器并按照所述安装证书

    --或者在您的应用程序中包含必要的文件(我相信这只适用于elastic beanstalk?),它将按照所述自动覆盖nginx配置文件

  • 确保nginx正在侦听端口443(应在上一步中完成)
  • 打开EC2服务器的安全组,该组与您希望流量进入服务器的位置相对应(端口80/端口443)
  • 对于我们的项目(很像其他描述的海报),我们使用了以下设置:

  • nginx作为端口80上所有调用的负载平衡器和代理(不直接调用关闭的端口3000上的node.js服务器)
  • pm2作为Node.js(和部署)的流程管理器
  • 用于监视的keymetrics.io
  • Nodejs v6.9.3硼/lts(通过NVM)
  • 带有WiredTiger引擎(Compose.io)的Mongodb 3.2
  • 用于托管的Amazon EC2实例(Amazon Linux而非Ubuntu)

  • 这个设置对我们来说非常有效。在这个设置中,我们可以在不使用amazon负载平衡器的情况下设置SSL

    一旦你有了证书文件,就不那么难了。您甚至可以在没有Nginx的情况下完成此操作

    让我们首先创建一个express Web服务器

    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
    
    有多种方法可以创建和刷新证书文件。所以,我不会在这里详细讨论这个问题。但最重要的是,您不需要amazon证书来完成它。LetsEncrypt免费、简单,工作良好


    通常我还会添加一个http服务器(不带HTTPS)并应用重定向。然后我也使用端口转发来实现这一点。因此,我在服务文件中添加了第二个端口转发规则。

    我有一个来自Name便宜的SSL证书,它被上传到IAM中。当我设置ELB时,我只会选择使用来自IAM的现有SSL证书。如何在EC2上安装它?我需要SSH吗@MarkBYes,您必须使用SSH连接到服务器并手动安装证书。在这种情况下,您将无法使用IAM管理证书。只有一个问题。当您谈到“您的SSL证书”时,您是指亚马逊证书吗是否可以为此使用amazon证书一些消息来源声称amazon证书只能用于AWS负载平衡器,AWS cloudfrontAWS证书管理器可以生成公共和私人证书。对公共证书进行签名,以便它们可以由客户端(如标准浏览器)进行公开验证。但是不能导出AWS公共证书。它们只能绑定到其他AWS服务(负载平衡器等)。AWS生成的私人证书可以导出,但不能公开签名。因此,您可以在客户端和服务器代码中手动安装它们以实现安全通信,但浏览器将无法验证它们。更多细节可以在这里找到:只想补充一下。当我们加密更新时,它会通过端口80进行更新。所以你也必须保持端口80打开。但是你使用AWS证书了吗?或者你是从第三方那里得到的?第三方。我们使用letsencrypt.org