Web Launch Playbook / 网站上线全流程手册
> 适用对象:没有运维经验的新手,也能照着走完从"本地能跑"到"公网 https 可访问"的全过程。
> 设计原则:每个阶段都给出 —— 🎯 目标 / 📝 操作 / ✅ 验证 / ⚠️ 坑。
一、触发条件
当用户出现以下任一诉求时使用本 skill:
- "我这个系统怎么上线?" / "怎么让别人访问到?"
- "买了服务器,接下来干什么?"
- "域名怎么解析?" / "怎么配置 HTTPS?" / "怎么申请 SSL 证书?"
- "网站打不开" / "502 Bad Gateway" / "连接超时"
- "上线前要检查什么?" / "安全吗?"
- "服务器重启后服务就没了怎么办?"
- "怎么备份数据?"
不适用:纯本地脚本/工具(不需要公网访问)、纯前端静态页丢 CDN。
1.1 提问太模糊时:先收敛,别倒清单
像「我这网站安全吗?」「帮我看看有没有问题」这类提问,信息量不足以给准确答复。
不要直接把整份清单倒出来 —— 新手会被淹死,也答不到他的真实痛点。
先问三要素(一次问完,别挤牙膏):
| # | 必问项 | 为什么关键 |
|---|---|---|
| 1 | 应用端口(如 3000)是不是开着公网? | 这是最高危项,直接决定要不要立刻止血 |
| 2 | 后台口令是默认/弱口令吗?改过没? | 第二高危,且改动成本极低 |
| 3 | 现在强制 HTTPS了吗?http 会不会直接跳转? | 影响传输安全与 Cookie 安全 |
拿到回答后,只输出对应优先级的动作(P0 → P1),不要 P2 一起堆。
同时给出自查命令,让用户自己先跑出事实(按用户的操作系统给对应的那条):
# 【Windows 用户】—— 本机自带 curl.exe,直接跑
curl.exe -m 5 -o NUL -w "%{http_code}" http://你的域名:3000/
# 返回 200/302 → 应用端口暴露在公网,高危急修
# 返回 000/超时 → 未暴露,符合预期
# 【Linux / macOS 用户】用配套脚本(含端口暴露 + 安全头等 8 项检查)
./scripts/verify-launch.sh example.com
> ⚠️ verify-launch.sh 是 bash 脚本,Windows 下需要 Git Bash 或 WSL 才能跑;
> Windows 用户优先用上面的 curl.exe 一行命令,或在 Git Bash 中执行该脚本。
> 判据:只有当用户能说清「端口是否公网开挖 / 口令强度 / 是否强制 HTTPS」三件事时,
> 才进入 references/05-安全加固.md 的完整 P0/P1/P2 清单。
> 否则一律先澄清 —— 宁可多问一句,不要给一份用不上的长文。
二、上线全景图(先看这张图,理解整体)
【你的电脑】 【云服务器】 【用户浏览器】
┌──────────────────┐ ┌───────────────────────┐ ┌──────────────┐
│ 本地开发 │ │ ① nginx (443/HTTPS) │ │ │
│ node server.js │ ②上传代码 │ ↓ 反向代理 │ ④访问 │ https:// │
│ localhost:3000 │ ─────────► │ ② 应用 (127.0.0.1: │◄──── │ 你的域名 │
│ 测试通过 ✅ │ │ 3000) Node/Python│ │ │
└──────────────────┘ │ ③ 数据/备份 │ └──────────────┘
└───────────────────────┘ ▲
①先有服务器和域名 ▲ │
③先配 DNS 解析 ────────────────────┘
关键认知(新手最常混淆):
1. 服务器 = 一台 24 小时开机的电脑,放在机房里(阿里云/腾讯云)
2. 域名 = 你家的门牌号(别人记不住 IP,但记得住 example.com)
3. DNS 解析 = 把门牌号翻译成 IP 地址(域名 → 你的服务器 IP)
4. nginx = 保安+前台,负责 HTTPS 加密、把请求转给后面的应用
5. 应用(3000 端口) = 真正干活的程序,不直接暴露到公网,只让 nginx 转发
三、两条路线,先选一条
| 路线 | 你的现状 | 从哪开始 | 预计耗时 |
|---|---|---|---|
| A. 速通版 | 服务器已装运行时装好、防火墙已放行 80/443、域名已备案、本地代码已跑通 | 直接跳 Stage 3 | 1-2 小时 |
| B. 完整版 | 从零开始(没买服务器/没域名),或不确定上面四项是否满足 | 从 Stage 0 开始 | 3-7 天(备案要等) |
> ⚠️ 选 A 之前请先确认那四项(尤其"运行时装好了"和"防火墙放行了"):
> 很多人以为"我已经有服务器了"就等于满足条件,结果跳过去在部署第一步就失败,
> 还绕过了检查点 #1。不确定就从 Stage 0 走,多花的 20 分钟远少于排错时间。
>
> 快速自测(在服务器上跑):
> > node -v # 有版本号 = 运行时装好了
>
> 防火墙放行情况请到云控制台「安全组 / 防火墙」确认 80、443 两条入站规则。
四、阶段总览
| 阶段 | 目标 | 关键产出 | 详情文档 |
|---|---|---|---|
| 0 | 准备 | 服务器 IP、域名、备案号 | references/01-新手必读-概念与准备.md |
| 1 | 本地开发规范 | 能跑通的代码 + 明确的上线文件清单 | references/01-新手必读-概念与准备.md |
| 2 | 服务器环境 | 运行时装好、防火墙放行 | references/02-服务器环境搭建.md |
| 3 | 部署 + 常驻 | 服务后台跑、开机自启、每日备份 | references/03-部署与常驻.md |
| 4 | 域名解析 | DNS A 记录指向服务器 IP | references/04-域名与HTTPS.md |
| 5 | SSL 证书 | 拿到 .pem + .key 两个文件 | references/04-域名与HTTPS.md |
| 6 | nginx 反代 | 80 跳 443、443 转应用 | references/04-域名与HTTPS.md |
| 7 | 安全加固 | 关端口、加鉴权、防爆破 | references/05-安全加固.md |
| 8 | 上线验证 | 全链路 checklist 全绿 | 本文第五节 |
| 9 | 运维与排障 | 出问题 5 分钟定位 | references/06-故障排查手册.md |
4.1 四个强制检查点(跳步是新手翻车主因)
标 🔴 CHECKPOINT 的地方停下来验证再往下走;标 🛑 STOP 的地方必须满足条件才能继续。
| # | 位置 | 标记 | 通过条件 |
|---|---|---|---|
| 1 | Stage 2 → 3 之间 | 🔴 CHECKPOINT | 运行时装好(node -v 有输出)且防火墙已放行 |
| 2 | Stage 3 部署完成 | 🔴 CHECKPOINT | 本机 curl http://127.0.0.1:3000 能返回内容,再去配域名 |
| 3 | Stage 6 改完 nginx | 🛑 STOP | 先 nginx -t 通过,才允许 -s reload |
| 4 | Stage 8 验证清单 | 🛑 STOP | 12 项全绿才能交付。任何一项红 → 回 Stage 对应环节 |
> 为什么强调 #2:域名/证书都配好了却发现应用本身起不来,是最浪费时间的一种翻车。
> 先让 127.0.0.1:3000 通过,外层的 DNS / nginx / 证书才有意义(见第七节分层定位心法)。
五、Stage 8:上线验证清单(上线当天照着勾)
□ 1. 域名解析正确 nslookup 你的域名 8.8.8.8 → 返回你的服务器 IP
□ 2. HTTP 能跳转 HTTPS 浏览器输入 http://域名 → 自动跳 https 且带锁
□ 3. HTTPS 证书有效 点击地址栏锁头 → 证书有效期正常、无警告
□ 4. 页面正常加载 首页打开无报错 → 内容完整
□ 5. 登录功能正常 用真实账号登录 → 能进主界面
□ 6. 增删改查正常 新建/编辑/删除各测一次 → 数据正确落库
□ 7. 上传功能正常 上传图片/文件 → 上传后能正常显示
□ 8. 刷新不掉登录 按 F5 多次 → 保持登录态
□ 9. 手机能访问 手机 4G(非 WiFi)打开 → 正常显示
□ 10. 服务开机自启 重启服务器,等 3 分钟再访问 → 依然正常(关键!)
□ 11. 备份任务生效 查看备份目录有今日文件 → 文件时间对、大小合理
□ 12. 备案号已展示 页面底部有 ICP 备案号链接 → 点击跳工信部网站
> 第 10 项最容易漏:很多人上线成功后就交付了,结果服务器一重启服务就没了。必须实测一次重启。
🛑 STOP —— 交付门控:12 项全部打勾才算上线完成。
任一项没通过 → 按第七节「分层定位心法」找到断掉的那一层,修完重跑本清单。
不要"大概没问题就先交付" —— 第 10 项(重启自启)和第 11 项(备份生效)尤其要实测,不能靠推测。
六、新手最容易踩的 12 个坑
| # | 坑 | 正确做法 |
|---|---|---|
| 1 | 服务器重启后服务没了 | 必须配置开机自启(计划任务 systemd) |
| 2 | 部署完就交付,没测重启 | 上线清单第 10 项强制实测 |
| 3 | 应用端口(3000)直接开公网 | 只开 80/443,应用端口仅本机可访问 |
| 4 | nginx 改了配置不测试直接重启 | 先 nginx -t 测语法,再 -s reload |
| 5 | 只改代码没备份数据 | 每天自动备份,且验证备份能恢复 |
| 6 | SSL 证书到期忘了续 | 90 天有效期,到期前 7 天续期,别删 DNS TXT 记录 |
| 7 | 用 root/管理员跑应用 | 用普通用户跑,降低被攻破后的影响面 |
| 8 | 密码写在代码里提交到 Git | 用环境变量,代码里只放兜底默认值 |
| 9 | 出问题就重启,不看日志 | 先看日志定位根因(见 06-故障排查手册) |
| 10 | 本地改了代码,忘了同步到服务器 | 建立"改完必同步"的清单,或做自动化部署 |
| 11 | .ps1 脚本存成 UTF-8 无 BOM | PowerShell 5.1 会把中文读成乱码 → 报莫名语法错误。必须存为 UTF-8 with BOM(见下) |
| 12 | 直接双击/运行 .ps1 报"禁止运行脚本" | 默认执行策略是 Restricted。必须用 -ExecutionPolicy Bypass(见下) |
6.1 Windows PowerShell 特有的两个坑(实测踩过)
坑 A:脚本编码 —— 必须 UTF-8 with BOM
Windows PowerShell 5.1 读取无 BOM 的 UTF-8 文件时按系统 ANSI 编码解析,脚本里的中文会变乱码,进而报出完全无关的语法错误:
FAIL: diagnose.ps1
L138: 表达式或语句中包含意外的标记"}"
L242: 字符串缺少终止符: "
L241: 语句块或类型定义中缺少右"}"
看起来是语法错误,实际是编码问题。 修复方式(用 PowerShell 转码):
$enc = New-Object System.Text.UTF8Encoding($true) # $true = 带 BOM
foreach ($f in @('C:\path\a.ps1','C:\path\b.ps1')) {
$c = Get-Content -Raw -Path $f -Encoding UTF8
[System.IO.File]::WriteAllText($f, $c, $enc)
}
> 判断依据:文件头三个字节是 EF BB BF 就是带 BOM。
> 用 VS Code 的话:右下角编码 → Save with Encoding → UTF-8 with BOM。
坑 B:执行策略 —— 必须用 Bypass
Windows 默认执行策略是 Restricted,直接运行 .ps1 会报:
无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本。
正确运行方式:
powershell -ExecutionPolicy Bypass -File C:\path\to\script.ps1
# 或在当前会话临时放开(仅本进程有效,不改系统设置)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
> 计划任务里调用 .ps1 时,命令要写成:
> powershell -ExecutionPolicy Bypass -File C:\path\script.ps1
七、故障速查(30 秒定位)
先记住这张表:浏览器报错 = 哪一层断了
| 现象 | 断在哪 | 30 秒定位 | 怎么修 |
|---|---|---|---|
| 连接超时 / 打不开 | ①DNS 或 ②防火墙 | nslookup 你的域名 8.8.8.8 |
DNS 错→补 A 记录;DNS 对→放行 80/443 |
| 502 Bad Gateway | nginx 活着,应用死了 | netstat -ano \| findstr :3000(Win)<br>ss -lntp \| grep 3000(Linux) |
无监听→重启应用;有监听仍 502→看应用日志 |
| 504 Gateway Timeout | 应用太慢/卡死 | 看应用日志尾部 + 数据库连接 | 定位慢查询;临时调大 nginx proxy_read_timeout |
| 400 Bad Request | nginx 配置有问题 | nginx -t |
按报错行修配置,修完先 -t 再 reload |
| 证书警告 | SSL 过期/域名不匹配 | openssl s_client -connect 你的域名:443 |
过期→续期;不匹配→查证书 server_name |
| 页面空白/样式丢失 | 应用返回了但资源 404 | F12 → Network 面板看红色请求 | 查静态目录路径与 nginx location 规则 |
| 登录后又跳回登录页 | Cookie/Session 问题 | F12 → Application → Cookies 看有无 session | https 下 Cookie 需 secure;反代要透传 X-Forwarded-Proto |
> 定位心法:按 ①DNS → ②防火墙 → ③nginx → ④反代 → ⑤应用 顺序逐层往下查,
> 第一次失败的那一层就是病根,不要在应用层瞎试。修法详见 references/06-故障排查手册.md。
八、常用命令速查
Windows Server
# 服务状态
tasklist | findstr node # 应用进程
tasklist | findstr nginx # nginx 进程
netstat -ano | findstr :3000 # 应用端口监听
netstat -ano | findstr :443 # HTTPS 监听
# 重启应用(隐藏窗口,关掉远程桌面也不断)
taskkill /F /IM node.exe
schtasks /Run /TN "你的应用任务名"
# 重启 nginx
cd C:\nginx
.\nginx.exe -t # 先测语法
.\nginx.exe -s reload # 平滑重载
> 🛑 STOP —— 用 taskkill /F /IM node.exe 前先确认
>
> /IM node.exe 是按映像名杀进程,会干掉本机所有 Node 进程。如果这台机器上
> 还跑着别的 Node 服务(比如另一个网站、某个构建工具),它们会被一起杀掉且不会自动恢复。
>
> 精确杀单个进程(推荐):
> powershell
> netstat -ano | findstr :3000 # 找出占用 3000 的 PID(最后一列)
> taskkill /F /PID 12345 # 只杀这个
>
> 确认本机只有这一个 Node 服务时,才可以用 /IM 的便捷写法。
> ⚠️ nginx 同理:taskkill /F /IM nginx.exe 会杀掉所有 nginx 进程(含其他站点)。
> 单站场景可用;多站共存时先 netstat -ano | findstr :443 定位 PID。
Linux
systemctl status 你的服务名
systemctl restart 你的服务名
ss -lntp | grep 3000
nginx -t && systemctl reload nginx
journalctl -u 你的服务名 -n 100 --no-pager # 看最近 100 行日志
九、配套脚本(scripts/)
| 脚本 | 平台 | 用途 |
|---|---|---|
diagnose.ps1 |
Windows | 一键健康诊断:进程/端口/响应/备份/磁盘/证书/计划任务 |
backup.ps1 |
Windows | 数据备份:带时间戳 + 自动清理旧备份 + 磁盘预警 |
diagnose.sh |
Linux | 一键健康诊断(同 diagnose.ps1) |
verify-launch.sh |
任意 | 从外部验证上线结果:DNS/www/HTTP/HTTPS/跳转/证书/端口暴露/安全头 |
nginx-reverse-proxy.conf |
任意 | nginx 反向代理配置模板(替换 6 个占位符即用) |
🛑 STOP —— 首次运行脚本前先确认两件事(否则必然报错,见 6.1):
1. 用 -ExecutionPolicy Bypass 调用,不要双击;
2. 脚本文件是 UTF-8 with BOM,若被记事本等编辑器重存过,需重新转码。
另外请显式传入 -AppPath(默认值仅占位):脚本里的默认路径是 C:\myapp,
与你实际的部署目录不一致时会全部报 FAIL。
用法:
# Windows —— ⚠️ 必须带 -ExecutionPolicy Bypass(否则默认策略禁止运行脚本)
powershell -ExecutionPolicy Bypass -File diagnose.ps1 -AppPort 3000 -AppPath C:\myapp -Domain example.com
powershell -ExecutionPolicy Bypass -File backup.ps1 -AppPath C:\myapp -KeepDays 30
# 注册每日自动备份计划任务(注意 -AppPath 要一起传进去)
schtasks /Create /TN "MyAppBackup" /TR "powershell -ExecutionPolicy Bypass -File C:\myapp\scripts\backup.ps1 -AppPath C:\myapp" /SC DAILY /ST 02:00 /RU SYSTEM /RL HIGHEST /F
# Linux
chmod +x diagnose.sh verify-launch.sh
./diagnose.sh 3000 myapp example.com
# 上线验证(在本地电脑跑,不在服务器上跑)
./verify-launch.sh example.com
> 备份产物形态:backup.ps1 产出目录 backups\20260913-0200\(内含 data/ uploads/ .env 等)。
> diagnose.ps1 同时兼容目录型与平铺文件型备份,两种都能正确识别,不会误报「今日没有备份」。
> ⚠️ 脚本是 UTF-8 with BOM 保存的,如果用编辑器改过,注意保持编码,否则中文会乱码报错(见 6.1)。
十、术语表(新手友好)
| 术语 | 一句话解释 |
|---|---|
| 服务器 / VPS / ECS | 机房里的电脑,24 小时开机,你远程操作它 |
| 公网 IP | 全世界都能访问到的地址,如 203.0.113.10(示例) |
| 端口 | 一栋楼的不同门,80=HTTP,443=HTTPS,3000=你的应用 |
| 域名 | 网站名字,如 example.com |
| DNS 解析 | 把域名翻译成 IP 的过程 |
| A 记录 | DNS 记录类型,把域名指向 IPv4 地址 |
| 备案 / ICP | 中国大陆境内网站必须的行政登记,否则域名会被拦 |
| SSL / TLS / HTTPS | 给数据传输加密,浏览器显示小锁 |
| 证书 DV/OV | DV=只验证域名所有权(免费/便宜),OV=还验证企业身份 |
| 反向代理 | 用户访问 nginx,nginx 再转给真正的应用(用户不知道后端) |
| 进程常驻 | 关掉远程连接后程序还在跑 |
| 开机自启 | 服务器重启后程序自动启动 |
| 计划任务 / systemd | Windows / Linux 上管理定时和自启任务的工具 |
| 502 Bad Gateway | nginx 联系不上后端应用(后端挂了或没启动) |
十一、给新手的执行建议
- 不要跳步:Stage 0→9 顺序执行,跳步会导致后面排查困难
- 每步都验证:不要"先把所有事情做完再一起测",出问题无法定位
- 记录每一步:边做边记路径、命令、密码,事后形成自己的说明书(可参考本 skill 的写法)
- 先跑通再优化:先保证 https 能访问,再做安全加固和性能优化
- 保留回滚能力:每次改动前备份配置,改坏了能马上还原
> 本 skill 来源:真实生产项目 myapp(自建 Node.js 订单系统)上线过程沉淀 —— 阿里云轻量服务器 Windows Server 2025 + Node.js + nginx 1.26.2 + 阿里云 DV 证书,2026-08 完成上线并稳定运行。