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
你应该会看到类似这样的输出:

只要 status 是 online,就说明成了。
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 证书(以阿里云为例)
- 登录阿里云控制台,搜索"SSL 证书"
- 点"免费证书" → "立即购买"(0 元)
- 选"DV 单域名证书",证书绑定的域名写你的 API 域名,比如
api.yourdomain.com - 验证方式选 DNS(如果你的域名也在阿里云,它会自动帮你添加 TXT 记录)
- 签发成功后下载证书,格式选 Nginx
- 你会得到两个文件:
.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 反向代理大功告成了。
六、日常更新代码的流程
以后每次改了代码,在服务器上走这几步: