从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程)

bWAPP靶场——下载与安装(Windows最全) ###下载 阅读详情

这篇教程适合谁?—— 你大概懂一点命令行,但从没在生产环境部署过 Node 项目
最终目标:把你的 NestJS / Express 后端安全跑在 Windows 服务器上,并且用 HTTPS 对外提供服务


📖 先说说我为什么要搞这件事

大家好,我是码农刚子。最近我“Vibe Coding”了一个小网站,技术栈如下:

  • 前端:Next.js 16 (App Router) + Tailwind CSS v4 + shadcn/ui
  • 后端:NestJS (Node.js)
  • 数据库:Supabase PostgreSQL

一开始我想着:全部扔到 Vercel 上不就完事了?毕竟 Vercel 对 Next.js 太友好了,一键部署,自动给 HTTPS,爽得很。

结果很快就被打脸了:Vercel 其实不适合部署 Node.js 后端。
它虽然有 Serverless Functions,但限制一大堆(响应时间、包大小、WebSocket 支持……),我这个 NestJS 项目体积不小,还用了不少传统的 Node 库,硬塞进去就是自找麻烦。

所以只能把后端单独部署出来。正好手里有一台阿里云的 Windows Server(上面已经跑着一些 .NET 站点),而且我本人从来没在生产环境部署过 Node 项目——这是纯纯的第一次实操,踩了无数坑。

于是我把整个折腾过程记了下来,整理成这篇小白照着做就能成功的教程。
如果你也跟我一样,想把一个真实的 Node 后端扔到自己的 Windows 云服务器上,那这篇文章就是为你写的。


🧰 你需要提前准备好这些东西

  • 一台 Windows Server(2016 / 2019 / 2022 都行),要有管理员权限
  • 你的后端项目代码(我用的是 NestJS,但 Express 之类的也一样)
  • 一个域名(后面要配 HTTPS 用)
  • 阿里云 / 腾讯云 / 其他云厂商的免费 SSL 证书(或者你知道怎么用 Let's Encrypt 也行)

一、装好基础环境

1. 装 Node.js

  1. 打开官网:https://nodejs.org/

Nodejs官网截图

  1. 下载 LTS 版本(比如 22.x)的 .msi 安装包
  2. 双击安装,一路点“下一步”,不要乱改安装路径(默认装在 C:\Program Files\nodejs)
  3. 装完之后,以管理员身份打开 PowerShell,敲下面两行检查一下:
node -v   # 应该显示 v22.x.x
npm -v    # 应该显示 10.x.x 或更高

powershell 查看node和npm版本

2. 装 PM2(进程守护工具)

PM2 的作用就是让你的 Node 程序在后台跑着,挂了能自动重启,服务器重启了也能自己起来。

npm install -g pm2
npm install -g pm2-windows-startup
pm2-startup install

这三条命令分别是:装 PM2 → 装 Windows 开机自启插件 → 把 PM2 注册成系统服务。搞定之后,重启服务器也不用怕了。


二、把项目代码弄到服务器上

1. 创建目录

mkdir C:\wwwroot\my-node-project
cd C:\wwwroot\my-node-project

2. 上传或克隆代码

  • 方法一(推荐):用 Git 直接拉下来
git clone https://github.com/你的用户名/你的仓库.git .
  • 方法二:用远程桌面或者 FTP 把文件夹整个复制进去

3. 重要安全提醒:检查 .gitignore

确保你的项目根目录或 backend 目录下有一个 .gitignore 文件,里面至少包含:

node_modules/
dist/
.env
*.log

如果你的 .env 文件已经被提交到 Git 了,赶紧把它从版本控制里移除(但本地文件要保留):

git rm --cached .env
git commit -m "remove env from git"

⚠️ .env 里存着数据库密码、JWT 密钥这些敏感信息,死活不能上传到 Git,记住了嗷。


三、装依赖 + 构建项目

1. 进入后端目录(如果你的前后端是分开的)

cd C:\wwwroot\my-node-project\backend   # 根据你的实际路径来

2. 装依赖

npm install

这个过程可能会花几分钟,耐心等一等。

3. 配置生产环境变量

在 backend 目录下创建 .env 文件(如果没有的话):

New-Item -Path .env -ItemType File

然后用记事本或 VS Code 打开 .env,写上类似下面的内容(按你自己的项目来):

PORT=3000
JWT_SECRET=一定改成一个超长的随机字符串
DATABASE_URL=你的数据库连接地址

🔐 想生成一个随机 JWT_SECRET?在 PowerShell 里直接跑这条命令:

-join ((48..57)+(65..90)+(97..122) | Get-Random -Count 64 | ForEach-Object {[char]$_})

4. 构建项目(这一步容易踩坑 ⚠️)

大部分 Node 项目(尤其是 NestJS)需要把 TypeScript 编译成 JavaScript。

通常的命令是:

npm run build

但是:如果你的项目用了 module: "nodenext" 这种配置,直接跑 nest build 可能会失败,导致 dist 目录是空的。

解决办法(以 NestJS 为例):

打开 package.json,找到 "build" 脚本,把:

"build": "nest build"

改成:

"build": "tsc -p tsconfig.build.json"

如果你不是 NestJS,而是普通的 TypeScript + Node,那构建命令一般就是 tsc 或者 tsc --project tsconfig.json。

改完之后,重新跑一遍构建:

npm run build

检查一下编译产物:

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

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

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 证书(以阿里云为例)

  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 记录:

主机记录记录类型记录值
apiA你服务器的公网 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 端口做自动重定向,然后就报错了。

Caddy文件目录展示截图

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 反向代理大功告成了。


六、日常更新代码的流程

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

cd C:\wwwroot\my-node-project
git pull

cd backend
npm install               # 如果有新依赖就装一下
npm run build             # 重新编译

pm2 restart my-node-backend
pm2 logs my-node-backend  # 看一眼启动日志,确认没报错

七、常见翻车现场 & 解决办法

现象可能原因怎么办
PM2 状态是 errored入口文件路径不对,或者依赖没装全检查 ecosystem.config.js 里的 script 路径;手动 node dist/main.js 看看报什么错
curl localhost:3000 没反应Node 没启动,或者端口被占netstat -ano \| findstr :3000 看端口;pm2 logs 看日志
Caddy 启动报 80 端口错误忘了加 auto_https off检查 Caddyfile 第一行
浏览器提示“连接不安全”证书域名不匹配,或者证书过期重新申请证书,确认 Caddyfile 里的域名跟证书域名完全一样
前端调用接口报 CORS 错误后端的 .env 没配允许的前端域名加上 CORS_ORIGIN=https://你的前端域名,然后 pm2 restart
改了 .env 但没生效PM2 没重启,环境变量没重新读pm2 restart my-node-backend 就好了

八、你成功完成了这些事

  • ✅ 装了 Node.js 和 PM2
  • ✅ 把代码弄到服务器上,装了依赖
  • ✅ 解决了 TypeScript 编译的小坑
  • ✅ 用 PM2 把 Node 进程守护起来,还能开机自启
  • ✅ 用 Caddy + 免费 SSL 证书 搞定了 HTTPS 反向代理
  • ✅ 开了防火墙端口,配置了开机启动任务

现在你的 Node.js 后端已经安安稳稳地跑在生产环境,可以通过 https://api.yourdomain.com:8443 对外提供服务了。

📌 最后再啰嗦几句:

  • 定期(比如每个月)登录阿里云控制台,瞅一眼 SSL 证书过期了没,快到期的重新申请替换一下
  • 每天有空就 pm2 logs --lines 50 看看有没有报错
  • 永远、永远不要把 .env 文件发给任何人,也不要传到 Git 上去

我是刚子,一个还在写 .NET 代码的程序员。祝你部署顺顺利利,永不宕机!如果觉得文章对你有用,记得点赞、收藏、转发给更多的小伙伴。

阅读原文:从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程) - 码农刚子的开发笔记

bwapp通关(全完结) bwapp/ A1 - Injection /HTML Injection - Reflected (GET)HTML Injection - Reflected (POST)HTML Injection - Reflected (Current URL)HTML Injection - Stored (Blog)iFrame InjectionLDAP Injection (Search)【待开化】 ---------------------- bWAPP v2.2 ----------------- 阅读详情

相关推荐

Bwapp平台的介绍与搭建方法

先来介绍一下bwapp bwapp是一款非常好用的漏洞演示平台,包含有100多个漏洞 SQL, HTML, iFrame, SSI, OS Command, XML, XPath, LDAP, PHP Code, Host Header and SMTP injections Authentication, authorization and session management issues Malicious, unrestricted file uploads and backdoor files

qq_45756971的博客 4203

Bwapp靶场下载安装

bWAPP(Buggy Web Application)是一个用于学习和测试Web应用程序安全的漏洞性Web应用程序。bWAPP通过提供多种常见Web应用程序漏洞(例如跨站点脚本(XSS)、SQL注入、文件包含等)来帮助用户了解和熟悉常见的安全问题。需要把mysql的版本换成5.7的,否则会报错。确认后直接点击BWAPP的打开网站。默认账号和密码为bee,bug。

seanyang_的博客 1438

腾讯云Windows服务器部署OpenClaw:从Node.js环境到AI智能体实战

Node.js作为现代JavaScript运行时环境,其核心原理是基于Chrome V8引擎,使得开发者能够使用JavaScript构建高性能的网络应用和后端服务。这一特性使其成为连接各类API与工具的理想平台,在自动化工作流和AI应用集成中展现出巨大技术价值。特别是在企业级应用场景中,常需在Windows Server环境下部署Node.js服务以实现业务需求。本文聚焦于如何在腾讯云Windows服务器上,通过配置Node.js环境、解决权限与网络策略问题,成功部署并运行OpenClaw智能体框架,实现A

482

bwapp下载与搭建(使用phpstudy搭建)

bwapp下载与搭建(使用phpstudy搭建) 文章主要对电脑已安装了MySQL和apache,解决使用phpstudy搭建bwapp时产生的问题 bwapp搭建有多种方法,可以看看其他文章挑选适合电脑环境的方法 文章目录bwapp下载与搭建(使用phpstudy搭建)一、bwapp下载二、phpstudy下载安装1.官网下载2.启动apache3.将bwapp放入phpstudy中4.启动MySQL5.bwapp的访问6.一些其他错误 一、bwapp下载 bwapp的GitHub下载链接:https

weixin_44794112的博客 1万+

Windows 11下BettaFish舆情项目保姆级部署教程:从PostgreSQL配置到Node.js环境避坑

本文提供Windows 11下BettaFish舆情项目的完整部署教程,涵盖PostgreSQL配置、Node.js环境设置及Python依赖管理等关键步骤。特别针对常见问题如编码错误、端口冲突等提供解决方案,帮助开发者快速搭建多智能体舆情分析系统,实现高效数据挖掘与分析。

weixin_30736301的博客 380

英飞凌AURIX 2G 系列MCU关于外设模块EVADC的实现原理及对应MCAL(EB Tresos)配置项详细讲解

本文章讲述了英飞凌AURIX 2G系列MCU关于外设模块EVADC的实现原理及对应MCAL配置工具(EB)的配置项。

weixin_46176506的博客 6276

从零开始在Windows系统上搭建一个node.js后端服务项目

打开app.js(原默认是index.js,没有选择直接回车,而是在后面输入app.js后再回车,因此我的入口文件就改成了app.js),可以看到,文件内是没有配置端口,以及启动打印的数据的,在这里可以自行手动配置下(app.get()或app.set()需要在var app = express();package文件内容随之改变,由于程序主入口是index.js,所以要创建index.js文件,(文件后缀必须是js)编辑index.js文件内容,为了快速,我们直接找到express官网,打开里面的示例。

2509_94094864的博客 850

开关电源环路补偿--开关电源进阶知识补充1

笔记 一 . 做开关电源环路补偿时候为了使得环路更加稳定。 1 .-- > 希望开关电源的相位裕量在45° 以上, 2. – > 希望开关电源的增益裕量在10db 以上 3. – > 希望开关电源增益曲线在过0db 时候以20db /dec 斜率下降(体现1个极点) 4. – > 希望开关电源补偿之后的带宽达到开关频率的是1/5 ~1/10,用以原理开关电源的开关噪音。 左边图示电源瞬态拉载和释放负载的时候输出电压存在明显的振铃,说明这个目前的环路相位裕量(phase m

qq_29776365的博客 1万+

新手向:从零开始Node.js超详细安装、配置与使用指南

Node.js是一个服务器端JavaScript运行环境,让JS可用于开发网站后台、命令行工具等。文章详细介绍了Windows、Mac和Linux系统的Node.js安装步骤,包括验证安装、配置npm包管理器以及解决常见问题。还演示了如何创建简单的HTTP服务器,并提供了npm常用命令速查表。最后给出了新手学习建议:从创建项目、使用Express框架到部署云服务器等进阶方向。全文以实操为主,强调环境配置和错误排查,帮助开发者快速上手Node.js开发。

这个人的博客 5531

手把手教你用神经网络优化电机控制:从Simulink仿真到实际部署

本文提供了一套完整的工程实践指南,详细讲解了如何将神经网络应用于电机控制,从Simulink仿真建模、轻量级网络设计,到关键的模型量化与代码生成,最终实现向DSP/FPGA硬件的实际部署。文章直面实时性、精度与资源限制等核心工程挑战,为工程师提供了从理论到落地的清晰路径和实用避坑策略。

weixin_29246195的博客 226

6、业务影响分析(BIA)的数据收集与关键指标评估

本文全面解析了业务影响分析(BIA)的核心内容,包括数据收集、业务流程分析、信息系统与资产清单、人员与供应商依赖、影响声明、关键指标评估(如MTD、RTO、RPO)、威胁建模与风险分析等。通过详细的介绍和图表展示,帮助组织系统性地制定灾难恢复计划,以应对各种潜在风险,确保关键业务流程在灾难发生后能够快速恢复并持续运营。

moss5的博客 374
上一篇: 为什么你的 AI 工具没人用?产品做完 ≠ 有人会用
下一篇: WebSocket 快速入门教程(附示例源码)
码农刚子.
博客等级 码龄8年 554粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农刚子.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值