使用 pm2 通过 HTTPS 在 node.js 上托管 Create-React-App SPA

问题描述

我已经成功地构建并提供了一个使用 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;
        }
}