Docker组成了在GCP VM内运行的2个容器:
version: '2'
services:
db:
image: mongo:3
ports:
- "27017:27017"
api-server:
build: .
ports:
- "443:8080"
links:
- db
volumes:
- .:/www
- /www/node_modules
端口重定向设置为443,已配置防火墙(我想),但是我仍然无法通过https连接到服务器。仅在http://ip_address:443上可用
我究竟做错了什么?
最佳答案
您做错了是假设您仅由于使用端口443而使流量变为SSL。
如果端口443
上的某些内容可作为http://<IP>:443/
访问,则意味着您正在443上运行纯HTTP应用程序。
因此,您在NodeJS服务器中将创建一个没有证书和私钥的简单服务器。
您有两种选择
在代码中使用SSL服务器
您可以更新NodeJS代码以作为https服务器进行侦听。像下面这样
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
将Nginx放在前面即可食用
您可以添加具有SSL配置的Nginx,然后通过代理将流量传递到您的NodeJS应用
version: '2'
services:
db:
image: mongo:3
ports:
- "27017:27017"
api-server:
build: .
volumes:
- .:/www
- /www/node_modules
nginx:
image: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./www:/usr/local/var/www
您将需要创建一个nginx conf文件
server {
listen 80;
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass http://api-server:8080;
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;
}
location /public {
root /usr/local/var/www;
}
}
PS:有关更多详细信息,请参见https://www.sitepoint.com/configuring-nginx-ssl-node-js/
关于ssl - Google Cloud Platform VM:https,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45531758/