You need to enable JavaScript to run this app. 基于Node.js+pm2为已部署的Create-React-App SPA配置HTTPS反向代理
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js+pm2为已部署的Create-React-App SPA配置HTTPS反向代理

核心结论

完全可以在代理层加载SSL证书、将pm2跑在5001端口的HTTP服务代理到443端口对外提供HTTPS访问,根本不需要让pm2托管的站点本身基于HTTPS模式运行。
SSL证书的加载、HTTPS流量握手、加解密操作全部在最前端的反向代理层完成即可,后端pm2跑纯HTTP服务没有任何兼容性问题,且全程不需要改动你目前已经跑通的pm2配置、站点映射逻辑,完全符合不推翻现有方案的需求。

实际流量链路

改造后的完整访问路径:

  • 用户浏览器 <-- HTTPS(443端口,完成SSL证书校验、流量加解密) --> 你的自定义反向代理服务
  • 反向代理服务 <-- 纯HTTP(本机内网链路,无加密开销) --> pm2托管的5001/5002静态服务

零改造成本的整合代码

不需要替换你已经写好的http-proxy逻辑,只需要把SSL加载、HTTPS服务监听的代码和原有代理逻辑合并即可,下面是可以直接落地的完整代码:

const http = require('http');
const https = require('https');
const fs = require('fs');
const httpProxy = require('http-proxy');

// 初始化代理实例
const proxy = httpProxy.createProxyServer({});

// 完全保留你原有的站点端口映射配置,不需要做任何修改
const siteMap = {
  "my_site1.com": "http://127.0.0.1:5001",
  "my_site2.com": "http://127.0.0.1:5002"
};

// 加载SSL证书
// 注意:fs模块不识别~/路径简写,必须替换为你证书文件的实际绝对路径,否则会报路径不存在错误
const sslOptions = {
  cert: fs.readFileSync('/home/你的账号名/ssl/foo.crt'),
  ca: fs.readFileSync('/home/你的账号名/ssl/foo.ca-bundle'),
  key: fs.readFileSync('/home/你的账号名/ssl/foo.key')
};

// 80端口监听:所有HTTP请求自动301跳转到对应HTTPS地址,符合常规访问习惯
http.createServer((req, res) => {
  res.writeHead(301, { "Location": `https://${req.headers.host}${req.url}` });
  res.end();
}).listen(80);

// 443端口监听:启动HTTPS代理服务
https.createServer(sslOptions, (req, res) => {
  const target = siteMap[req.headers.host];
  // 匹配不到对应站点时返回404,避免服务报错崩溃
  if (!target) {
    res.writeHead(404);
    res.end('站点不存在');
    return;
  }
  // 把请求转发给对应的pm2静态服务
  proxy.web(req, res, {
    target: target,
    changeOrigin: true // 必加配置:修正请求头Host值,避免pm2 serve因Host校验异常导致SPA路由失效
  });
}).listen(443);

// 全局捕获代理错误,避免后端服务不可用时整个代理进程崩溃
proxy.on('error', (err, req, res) => {
  res.writeHead(503);
  res.end('后端服务暂时不可用');
});

关键注意事项

  • pm2跑的pm2 serve静态服务完全不需要调整,保持现有HTTP模式、端口、SPA配置不变即可,不存在任何兼容性问题
  • 这个部署模式刚好匹配pm2无法直接运行HTTPS服务的特性:pm2只负责静态进程的保活、托管,HTTPS相关的所有逻辑全部交给你写的Node代理实现,不需要额外引入其他工具,完全保留现有技术栈
  • 证书读取路径不要使用~/用户目录简写,Node.js内置fs模块不会自动解析该路径,必须填写完整的文件系统绝对路径
  • 反向代理配置必须加上changeOrigin: true,否则部分场景下pm2托管的SPA应用会出现路由跳转404、资源加载失败的问题
  • 80、443属于系统特权端口,非root用户启动Node服务时需要提前配置端口放行规则,否则会出现权限不足导致的启动失败

内容的提问来源于stack exchange,提问作者Slocombe9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 08:06:02