检查一下编译产物:

复制代码
Test-Path dist/main.js   # 或者 dist/src/main.js(看你的配置)

如果返回 True,说明编译成功了。

💡 实在不行,你也可以在本地编译好了,把整个 dist 文件夹直接上传到服务器,跳过服务器上编译这一步。


四、用 PM2 启动后端

1. 写 PM2 配置文件

在项目的根目录 (比如 C:\wwwroot\my-node-project)下新建一个文件,叫 ecosystem.config.js,内容如下:

复制代码
module.exports = {
  apps: [
    {
      name: 'my-node-backend',          // 给你的应用起个好认的名字
      cwd: './backend',                 // 入口文件在哪个目录(按你实际的改)
      script: 'dist/main.js',           // 编译后的入口文件
      instances: 1,
      autorestart: true,
      watch: false,
      max_memory_restart: '500M',
      env: {
        NODE_ENV: 'production',
        PORT: 3000,
      },
      error_file: './logs/backend-error.log',
      out_file: './logs/backend-out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',
    },
  ],
};

📁 别忘了先创建 logs 文件夹: mkdir C:\wwwroot\my-node-project\backend\logs

2. 启动应用

复制代码
cd C:\wwwroot\my-node-project
pm2 start ecosystem.config.js
pm2 save

3. 看看到底跑起来没有

复制代码
pm2 status

你应该会看到类似这样的输出:

只要 statusonline,就说明成了。

4. 本地测试一下接口

复制代码
curl http://localhost:3000/api/health   # 换成你项目里真实存在的接口

如果返回了数据(哪怕是 401 未授权也没关系,起码说明服务在跑),就恭喜你,Node 程序已经在后台欢快地工作了。


五、配置 HTTPS 反向代理(用 Caddy)

为啥要搞这个?

因为你的前端(比如部署在 Vercel)强制用了 HTTPS,而浏览器有个安全策略:HTTPS 页面不能去请求 HTTP 接口 ,否则会报 Mixed Content 错误。

所以你的后端也必须通过 HTTPS 对外暴露。

但是 :你服务器上可能已经有 IIS 或者其他服务占用了 80 和 443 端口。

所以我们换个思路:用 Caddy 监听一个高位端口(比如 8443),手动挂上 SSL 证书,这样就不会跟 IIS 打架了。

1. 下载 Caddy

在 PowerShell 里执行:

复制代码
Invoke-WebRequest -Uri "https://github.com/caddyserver/caddy/releases/download/v2.9.1/caddy_2.9.1_windows_amd64.zip" -OutFile "$env:TEMP\caddy.zip"
New-Item -Path "C:\caddy" -ItemType Directory -Force
Expand-Archive "$env:TEMP\caddy.zip" -DestinationPath "C:\caddy" -Force

2. 搞一张免费 SSL 证书(以阿里云为例)

  1. 登录阿里云控制台,搜索"SSL 证书"
  2. 点"免费证书" → "立即购买"(0 元)
  3. 选"DV 单域名证书",证书绑定的域名写你的 API 域名,比如 api.yourdomain.com
  4. 验证方式选 DNS(如果你的域名也在阿里云,它会自动帮你添加 TXT 记录)
  5. 签发成功后下载证书,格式选 Nginx
  6. 你会得到两个文件:.pem(证书)和 .key(私钥)

把这两个文件放到 C:\caddy\ 目录下,像这样:

复制代码
C:\caddy\api.yourdomain.com.pem
C:\caddy\api.yourdomain.com.key

3. 配置 DNS 解析

去你的域名管理后台,加一条 A 记录

主机记录 记录类型 记录值
api A 你服务器的公网 IP

等几分钟让解析生效,可以用这条命令验证:

复制代码
Resolve-DnsName api.yourdomain.com

应该会返回你的公网 IP。

4. 写 Caddyfile

C:\caddy\ 目录下新建一个文件,就叫 Caddyfile(没有扩展名),内容如下:

复制代码
{
    auto_https off
}

api.yourdomain.com:8443 {
    tls C:\caddy\api.yourdomain.com.pem C:\caddy\api.yourdomain.com.key
    reverse_proxy localhost:3000
}

⚠️ 这一行的 auto_https off 千万不能少,不然 Caddy 会试图去占 80 端口做自动重定向,然后就报错了。

5. 测试一下 Caddy 能不能跑

复制代码
cd C:\caddy
.\caddy.exe run --config Caddyfile --resume=false

如果你看到了 server running 并且没有报错,那就成功了。按 Ctrl+C 先停掉。

6. 让 Caddy 开机自启(用任务计划)

关掉刚才的 Caddy 窗口,然后以管理员身份打开 PowerShell,执行下面这一大坨命令:

复制代码
$action = New-ScheduledTaskAction `
    -Execute "C:\caddy\caddy.exe" `
    -Argument "run --config C:\caddy\Caddyfile" `
    -WorkingDirectory "C:\caddy"

$trigger = New-ScheduledTaskTrigger -AtStartup

$settings = New-ScheduledTaskSettingsSet `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -StartWhenAvailable `
    -RestartCount 5 `
    -RestartInterval (New-TimeSpan -Minutes 1)

Register-ScheduledTask `
    -TaskName "Caddy-API-Proxy" `
    -Action $action `
    -Trigger $trigger `
    -Settings $settings `
    -RunLevel Highest `
    -Force

Start-ScheduledTask -TaskName "Caddy-API-Proxy"

检查一下 8443 端口是不是已经在监听了:

复制代码
netstat -ano | findstr :8443

应该会显示 LISTENING

7. 开放防火墙端口

复制代码
netsh advfirewall firewall add rule name="Allow HTTPS 8443" dir=in action=allow protocol=TCP localport=8443

另外,如果你的云服务器还有安全组(阿里云叫安全组规则),也要去控制台添加入方向规则:允许 TCP 8443。

8. 测试 HTTPS 接口

打开浏览器,或者直接敲命令:

复制代码
curl https://api.yourdomain.com:8443/api/health

如果能返回数据(哪怕是 401),就说明 HTTPS 反向代理大功告成了。


六、日常更新代码的流程

以后每次改了代码,在服务器上走这几步:

相关推荐
想会飞的蒲公英2 天前
TF-IDF + 随机森林中文文本分类全链路实战:从训练脚本到 Flask API + Streamlit 前端
人工智能·pytorch·python·随机森林·分类·flask·tf-idf
popcorn_min23 天前
共享单车需求预测:时间特征工程 + 随机森林,R² 达到 0.931
随机森林·r语言·kotlin
机器学习之心24 天前
基于Adaboost增强的随机森林回归(RF-Adaboost)时间序列预测
随机森林·adaboost增强
DXM052125 天前
第13期|遥感语义分割模型:U-Net核心原理+遥感落地优势
人工智能·python·深度学习·目标检测·随机森林·机器学习·支持向量机
叫我:松哥25 天前
基于Python的共享单车租赁数据分析与预测系统,技术栈flask+boostrap+随机森林+XGBoost
人工智能·python·深度学习·算法·随机森林·数据分析·flask
popcorn_min1 个月前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
popcorn_min1 个月前
Wine Quality 可复现机器学习实验:随机森林二分类实战
随机森林·机器学习·分类
XGeFei1 个月前
时序算法 —— LSTM、ARIMA、随机森林
算法·随机森林·lstm
数据科学小丫1 个月前
算法:随机森林算法
算法·随机森林·机器学习