问题描述
我已经成功地构建并提供了一个使用 node.js 上的 create-react-app 和 pm2 通过 HTTP 使用以下命令构建的单页应用程序:
pm2 serve ~/my_site1/build 5001 --spa --name "my_site1.com"
然后启动代理服务器以允许它与我的其他域同时托管在端口 80 上:
var httpProxy = require("http-proxy");
var proxy = httpProxy.createProxyServer();
var options = {
"my_site1.com": "http://555.555.555.555:5001","my_site2.com": "http://555.555.555.555:5002",};
http
.createServer(function (req,res) {
proxy.web(req,res,{
target: options[req.headers.host],});
})
.listen(80);
这一切都运行良好,除了出于各种原因,我现在意识到我需要使用 HTTPS 而不是 HTTP,但是我不知道如何协调我看到的与此相关的各种代码片段,例如这个获取证书并直接创建服务器:
const fs = require('fs');
const cert = fs.readFileSync('~/ssl/foo.crt');
const ca = fs.readFileSync('~/ssl/foo.ca-bundle');
const key = fs.readFileSync('~/ssl/foo.key');
let sslOptions = {
cert: cert,ca: ca,key: key
};
const httpsServer = https.createServer(sslOptions,(req,res) => {
res.statusCode = 200;
res.setHeader('Content-Type','text/html');
res.end("<h1>HTTPS server running</h1>");
});
我通过 another post 发现 pm2 不能直接在 HTTPS 上运行,而且我不想放弃我迄今为止所做的所有工作,以其他文章建议的不同方法重新开始.我觉得我非常接近,只需要将最后一跳从端口 5001 调整为 HTTPS。
有没有办法将我的站点(通过 pm2 在端口 5001 上运行)代理到端口 443 并同时加载证书?还是必须在 HTTPS 上创建站点本身(例如通过 https.CreateServer)才能加载证书等?
解决方法
最后我放弃了,转而使用 nginx 反向代理到我现有的 pm2 运行服务器的端口:5001。这还包括将客户端 http 请求重定向到 https。
关于这个问题有很多问题和答案,但在多次错误开始后找到了答案here。
安装nginx后,我把/etc/nginx/sites-available/default文件编辑成这样(xxx.xxx.xxx.xxx自始至终都是同一个IP,“my_site”是我的域名):
server {
listen xxx.xxx.xxx.xxx:80;
server_name my_site.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen xxx.xxx.xxx.xxx:443;
server_name my_site.com;
root /vhosts/my_site.com;
ssl on;
ssl_certificate ssl/my_site/my_site_com.crt;
ssl_certificate_key ssl/my_site/my_site_com.key;
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites,recommended 2048 bits
#ssl_dhparam /etc/pki/nginx/dh2048.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE$
location / {
proxy_pass http://xxx.xxx.xxx.xxx:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}