我有一个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命中此端口。我的实例设置具有安全组,如下所示:
我可以在普通HTTP上访问端口3000,但不能在HTTPS上访问端口,有人知道我要去哪里了吗?
答案 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;
}
}
}
我绝对会推荐第二种方法!祝你好运!