侦听对EC2上的3000端口进行HTTPS请求的Node.js Express应用

时间:2018-10-23 22:01:43

标签: javascript node.js amazon-web-services amazon-ec2 https

我有一个nodejs应用,该应用使用express侦听3000个请求,如下所示:

var express = require('express');
var app = express();
app.listen(3000, function () {
   console.log('Running on port 3000')
});

当我使用ngrok在本地运行服务器时,这适用于HTTPS请求。但是在EC2上运行nodejs应用程序时,我无法通过HTTPS命中此端口。我的实例设置具有安全组,如下所示:

enter image description here

我可以在普通HTTP上访问端口3000,但不能在HTTPS上访问端口,有人知道我要去哪里了吗?

1 个答案:

答案 0 :(得分:1)

MattTheHack,默认情况下,我认为Express通过HTTP Server进行侦听。您可以在此处执行两件事,第一件事是将节点快速应用程序部署为HTTPS服务器,这需要正确的密钥来进行设置。

类似以下内容:

var express = require('express')
var fs = require('fs')
var https = require('https')
var app = express()

app.get('/', function (req, res) {
  res.send('hello world')
})

https.createServer({
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.cert')
}, app)
.listen(3000, function () {
  console.log('Example app listening on port 3000! Go to https://localhost:3000/')
})

实际上不建议这样做,因为这样节点将解密所有HTTPS通信。

推荐的解决方案是将NGINX或其他路由工具也放置在服务器上。然后,您可以将NGINX视为代理,并允许NGINX为您执行解密。您的节点应用仍然可以作为HTTP服务器侦听端口3000,而NGINX只需将HTTPS端口443流量重定向到localhost:3000

nginx.conf

http {
  server {
    listen 443 ssl;
    ssl_certificate      "PATH_TO_CERT";
    ssl_certificate_key  "PATH_TO_CERT_KEY";

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
  }
}

我绝对会推荐第二种方法!祝你好运!