feat(docs): enhance interactive demos and improve documentation
- Add new interactive components for frontend routing, browser rendering pipeline, and database transactions - Improve existing demos with better visuals, explanations, and examples - Update documentation structure and content for better clarity - Add new utility scripts and update package.json with new commands - Fix formatting and alignment in documentation tables
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+963
-503
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+507
-178
@@ -1,263 +1,592 @@
|
||||
# 部署与上线 (Deployment & Release)
|
||||
# 服务上线之旅:从代码到用户眼中的网页
|
||||
|
||||
> 💡 **学习指南**:本章节不讲复杂的服务器运维,而是通过“交互式体验”,带你从零看懂一个网站是如何从你的电脑“跑”到用户手机里的。
|
||||
|
||||
## 0. 全局概览:一个请求的“奇幻漂流”
|
||||
|
||||
你有没有想过,当你在浏览器输入网址并回车的那一瞬间,到底发生了什么?
|
||||
其实,这就像是一次**快递配送**的过程。
|
||||
|
||||
不过,根据你要“送”的东西不同,配送路线也会稍微有点不一样。
|
||||
|
||||
**为什么会有这些区别呢?**
|
||||
就像在现实生活中,不同的东西有不同的送法:
|
||||
|
||||
1. **发传单(静态网页)**:
|
||||
- _场景_:公司的介绍页、博客文章。
|
||||
- _特点_:内容是**死**的,印好了就不变了。
|
||||
- _做法_:直接把“传单”贴在离用户最近的宣传栏(CDN)上。谁来看都一样,速度最快,成本最低。
|
||||
|
||||
2. **送乐高积木(SPA 单页应用)**:
|
||||
- _场景_:类似飞书、Notion 这种复杂的网页软件。
|
||||
- _特点_:交互特别多,像个**软件**。
|
||||
- _做法_:先给你寄一个“空盒子”和一大堆“零件”(JS代码),你的浏览器收到后,自己在本地把页面“拼”出来。
|
||||
- _好处_:一旦加载完,点哪里都很快,因为不需要再找服务器要页面了,只需要要数据。
|
||||
|
||||
3. **送热披萨(SSR 服务端渲染)**:
|
||||
- _场景_:股票大盘、新闻头条、个性化推荐。
|
||||
- _特点_:数据**实时变动**,或者需要**千人千面**。
|
||||
- _做法_:必须在用户下单的那一秒,由办事员(服务器)现场查数据、现场组装好页面,再热乎乎地交给你。
|
||||
- _好处_:数据绝对新鲜,而且搜索引擎(爬虫)最喜欢这种完整的页面。
|
||||
|
||||
下面这个互动图,带你体验这三种不同的“配送路线”:
|
||||
|
||||
<DeploymentArchitecture />
|
||||
|
||||
不管你选择哪种模式,一个**完整的请求**通常都要经过以下这些关卡。
|
||||
让我们看看它们都是干什么的,以及**为什么**我们缺不了它们:
|
||||
|
||||
1. **用户 (User) —— 寄件人**
|
||||
- _动作_:在浏览器输入网址,回车。
|
||||
- _人话_:就像是你发出了一个“我想看网页”的请求包裹。
|
||||
|
||||
2. **DNS (域名解析) —— 查号台**
|
||||
- _为什么需要?_ 电脑只认识数字(IP地址),人脑只记得住单词(域名)。
|
||||
- _人话_:它负责告诉你“baidu.com”这个名字对应的**门牌号 (IP地址)** 到底是哪一家。
|
||||
|
||||
3. **CDN (内容分发) —— 家门口的快递柜**
|
||||
- _为什么需要?_ 服务器可能在地球另一边,传一张图片过来太慢了。
|
||||
- _人话_:如果你要的东西(图片、视频)在楼下的快递柜(CDN节点)里正好有备份,直接给你,**不用跑远路**去总仓库取。
|
||||
|
||||
4. **WAF (防火墙) —— 小区保安**
|
||||
- _为什么需要?_ 互联网上有很多坏人(黑客)想搞破坏。
|
||||
- _人话_:它站在门口,把带炸弹的、发传单的(恶意攻击)都**拦在外面**,只让正常的客人进去。
|
||||
|
||||
5. **LB (负载均衡) —— 大堂经理**
|
||||
- _为什么需要?_ 访问的人太多了,一台服务器累死也干不完。
|
||||
- _人话_:它看着后面开着的 10 个窗口(服务器),把你引导到那个**最空闲**的窗口去办理业务,不让你干等。
|
||||
|
||||
6. **Server (服务器) —— 办事员**
|
||||
- _为什么需要?_ 总得有人真正干活,处理你的订单、计算金额。
|
||||
- _人话_:他是真正**处理业务**的人,负责把网页内容拼好,或者把数据算出来给你。
|
||||
|
||||
7. **DB (数据库) —— 档案室**
|
||||
- _为什么需要?_ 办事员脑子记不住那么多数据,而且断电了不能忘。
|
||||
- _人话_:这里**永久保存**着你的账号、密码、历史订单等核心机密数据。
|
||||
|
||||
弄懂了这个流程,部署就不难了。部署无非就是把这些环节一个个打通。
|
||||
> **学习指南**:本章节带你完整体验"一个服务上线"的全过程。我们不讲复杂的运维术语,而是通过小明的咖啡店网站上线故事,让你看懂代码是怎么变成用户能访问的网站的。
|
||||
|
||||
---
|
||||
|
||||
## 1. 域名与 DNS:给你的网站起个名
|
||||
## 0. 引言:小明的咖啡店网站要上线了
|
||||
|
||||
你想让别人访问你的网站,总不能给人家一串冷冰冰的数字(IP 地址:`123.45.67.89`)吧?
|
||||
你需要一个好记的名字,比如 `my-cool-site.com`。这就是**域名**。
|
||||
小明是个前端开发,他用 Vue 写了一个漂亮的咖啡店网站:可以看菜单、在线下单、查看订单状态。
|
||||
|
||||
而 **DNS**,就是负责把这个“好记的名字”翻译成“机器能懂的 IP”的系统。
|
||||
网站在**小明的电脑上**跑得好好的,但是问题来了:
|
||||
|
||||
### 1.1 常见的记录类型
|
||||
> **怎么让全世界的人都能访问这个网站?**
|
||||
|
||||
在配置域名时,你会看到很多选项,别晕,最常用的就这俩:
|
||||
这就像小明在家做了一桌子菜,现在要开餐厅让所有人来吃。这可不是简单地"把菜端出去"那么简单,他要经历一整套完整的流程。
|
||||
|
||||
- **A 记录**:最直接的。告诉 DNS,“`my-site.com` 的 IP 是 `1.2.3.4`”。
|
||||
- **CNAME 记录**:起别名。告诉 DNS,“`www.my-site.com` 也就是 `my-site.com`”。这在接入 CDN 时特别常用。
|
||||
<DeploymentOverviewDemo />
|
||||
|
||||
### 1.2 避坑指南
|
||||
**服务上线就是一场"搬家+开业"的大工程**:
|
||||
|
||||
- **生效慢**:DNS 修改不是立即生效的,全球同步可能需要几分钟到几小时(受 TTL 影响)。
|
||||
- **配错了**:如果不小心配错了 IP,用户就真的找不到你了。
|
||||
1. **打包行李** → 把代码打包成服务器能懂的格式
|
||||
2. **找房子** → 选择服务器(云服务器/VPS)
|
||||
3. **搬家** → 把代码部署到服务器
|
||||
4. **装修** → 配置运行环境
|
||||
5. **挂牌** → 配置域名和DNS
|
||||
6. **安防** → 安装HTTPS证书
|
||||
7. **招服务员** → 配置负载均衡
|
||||
8. **开分店** → 配置CDN加速
|
||||
9. **自动化** → 建立CI/CD流程
|
||||
10. **守夜人** → 监控和备份
|
||||
|
||||
<DnsFlowDemo />
|
||||
让我们跟着小明,一步一步完成这场"上线之旅"!
|
||||
|
||||
---
|
||||
|
||||
## 2. 服务器:你的网站“住”在哪?
|
||||
## 1. 打包行李:把代码变成"可携带的包裹"
|
||||
|
||||
代码写好了,得找个地方跑起来。这个地方就是**服务器**。
|
||||
你可以把它想象成一台**永不关机、连着公网的电脑**。
|
||||
小明的网站代码在他电脑上是这样散落的:
|
||||
|
||||
### 2.1 怎么选配置?
|
||||
```
|
||||
my-coffee-shop/
|
||||
├── src/ # 源代码
|
||||
│ ├── App.vue # Vue 组件
|
||||
│ ├── main.js # 入口文件
|
||||
│ └── assets/ # 图片、样式
|
||||
├── package.json # 依赖清单
|
||||
└── vite.config.js # 构建配置
|
||||
```
|
||||
|
||||
新手最容易犯两个错:
|
||||
这些源代码浏览器**看不懂**。浏览器只认识:
|
||||
- HTML 文件(网页骨架)
|
||||
- CSS 文件(网页样式)
|
||||
- JS 文件(网页逻辑)
|
||||
|
||||
1. **买太小**:1核1G 的机器,跑个 Hello World 还行,稍微装点东西就卡死。
|
||||
2. **买太大**:一上来就买 8核16G,结果每天只有 10 个人访问,纯属浪费钱。
|
||||
### 1.1 为什么要"构建"?
|
||||
|
||||
**建议**:先买个入门款(比如 2核4G),不够了再随时升级。云服务器的好处就是可以弹性伸缩。
|
||||
想象小明做了一桌子菜,现在要打包外卖:
|
||||
|
||||
### 2.2 最小上云脚本 (Ubuntu)
|
||||
<DeploymentBuildDemo />
|
||||
|
||||
买好服务器后,通常是空的。你需要装一些基础软件。
|
||||
把下面这段话复制到服务器终端里运行,就能装好 Nginx(Web服务器)和 Node.js(运行环境):
|
||||
**构建(Build)就是"打包外卖"的过程**:
|
||||
|
||||
1. **翻译**:把 Vue 组件翻译成浏览器懂的 HTML/CSS/JS
|
||||
2. **压缩**:把代码体积缩小(省流量、加载快)
|
||||
3. **合并**:把几十个小文件合成几个大包(减少请求)
|
||||
4. **哈希**:给文件名加上指纹(`app.abc123.js`),浏览器缓存友好
|
||||
|
||||
运行构建命令:
|
||||
|
||||
```bash
|
||||
# 1. 更新系统软件库
|
||||
npm run build
|
||||
```
|
||||
|
||||
构建完成后会生成一个 `dist` 文件夹:
|
||||
|
||||
```
|
||||
dist/
|
||||
├── index.html # 主页面
|
||||
├── assets/
|
||||
│ ├── app.abc123.js # 打包后的JS(278KB)
|
||||
│ ├── app.abc123.css # 打包后的CSS(45KB)
|
||||
│ └── logo.789xyz.png # 优化后的图片
|
||||
```
|
||||
|
||||
这个 `dist` 文件夹,就是小明的"行李箱",里面装着所有要搬去服务器的东西。
|
||||
|
||||
---
|
||||
|
||||
## 2. 找房子:选择服务器
|
||||
|
||||
代码打包好了,现在要找个"房子"住。这个房子就是**服务器**。
|
||||
|
||||
### 2.1 服务器是什么?
|
||||
|
||||
服务器 = **一台永远不关机、连着互联网的电脑**
|
||||
|
||||
<DeploymentServerDemo />
|
||||
|
||||
### 2.2 怎么选服务器?
|
||||
|
||||
小明有几个选择:
|
||||
|
||||
| 方案 | 类比 | 优点 | 缺点 | 价格 |
|
||||
|------|------|------|------|------|
|
||||
| **虚拟主机** | 租个床位 | 便宜、简单 | 性能差、不能随便装软件 | ¥50-200/年 |
|
||||
| **云服务器** | 租整套公寓 | 自由度高、可扩展 | 需要自己配置 | ¥100-1000/年 |
|
||||
| **容器服务** | 租豪华酒店 | 自动化管理 | 价格高 | ¥500+/月 |
|
||||
| **Serverless** | 租用会议室 | 用多少付多少 | 冷启动慢 | 按量计费 |
|
||||
|
||||
**小明的选择**:云服务器(2核4G,约¥500/年)
|
||||
|
||||
选配置的误区:
|
||||
|
||||
- ❌ **太小了**:1核1G,跑个Hello World还行,稍微多点人就卡死
|
||||
- ❌ **太大了**:一上来就8核16G,每天10个访问,纯属浪费
|
||||
- ✅ **刚刚好**:2核4G起步,不够了再升级(云服务器支持弹性伸缩)
|
||||
|
||||
### 2.3 主流云厂商
|
||||
|
||||
| 厂商 | 特点 | 适合人群 |
|
||||
|------|------|---------|
|
||||
| **阿里云** | 国内访问快、文档多 | 国内业务首选 |
|
||||
| **腾讯云** | 价格亲民、微信生态 | 小程序开发者 |
|
||||
| **AWS** | 全球覆盖、功能最强 | 国际业务 |
|
||||
| **Vercel** | 免费额度、零配置 | 前端项目快速上线 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 搬家:把代码放到服务器上
|
||||
|
||||
服务器租好了,现在要把代码"搬"过去。
|
||||
|
||||
### 3.1 怎么连接服务器?
|
||||
|
||||
服务器在遥远的机房,怎么操作?用 **SSH(远程连接工具)**:
|
||||
|
||||
```bash
|
||||
# 连接到服务器
|
||||
ssh root@123.45.67.89
|
||||
|
||||
# 输入密码后,你就"进入"服务器了
|
||||
# 后面敲的命令,都是在服务器上执行
|
||||
```
|
||||
|
||||
<DeploymentSSHDemo />
|
||||
|
||||
### 3.2 部署方式对比
|
||||
|
||||
| 方式 | 类比 | 优点 | 缺点 |
|
||||
|------|------|------|------|
|
||||
| **FTP上传** | 自己扛箱子搬家 | 简单直观 | 容易漏传文件、慢 |
|
||||
| **Git拉取** | 让快递公司送货 | 快、可追溯 | 需要配置Git |
|
||||
| **Docker容器** | 用搬家集装箱 | 环境一致、易迁移 | 需要学习Docker |
|
||||
|
||||
**推荐方式**:Git + Build Script
|
||||
|
||||
小明用 Git 把代码推送到 GitHub,然后让服务器自己拉取最新代码:
|
||||
|
||||
```bash
|
||||
# 服务器上执行的脚本
|
||||
cd /var/www/coffee-shop
|
||||
git pull origin main # 拉取最新代码
|
||||
npm install # 安装依赖
|
||||
npm run build # 构建项目
|
||||
pm2 restart all # 重启服务
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 装修:配置运行环境
|
||||
|
||||
代码搬过去了,但是服务器还只是个"空房子",需要"装修"才能住人。
|
||||
|
||||
### 4.1 需要装什么?
|
||||
|
||||
<DeploymentEnvironmentDemo />
|
||||
|
||||
**最小化安装脚本**(Ubuntu系统):
|
||||
|
||||
```bash
|
||||
# 1. 更新系统
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# 2. 安装 Nginx (Web服务器) 和 Git (拉代码用)
|
||||
sudo apt install -y nginx git curl
|
||||
# 2. 安装 Nginx(Web服务器,负责接待客人)
|
||||
sudo apt install -y nginx
|
||||
|
||||
# 3. 安装 Node.js (这里选了版本 18)
|
||||
# 3. 安装 Node.js(运行JavaScript代码)
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||
sudo apt install -y nodejs
|
||||
|
||||
# 4. 安装 PM2 (这是个好东西,能帮你把网站进程“守”住,崩溃了自动重启)
|
||||
sudo npm i -g pm2
|
||||
# 4. 安装 PM2(进程管家,防止程序崩溃)
|
||||
sudo npm install -g pm2
|
||||
|
||||
# 5. 安装 Git(拉代码用)
|
||||
sudo apt install -y git
|
||||
```
|
||||
|
||||
<ServerSizerDemo />
|
||||
### 4.2 Nginx 反向代理是什么?
|
||||
|
||||
小明的程序跑在 `3000` 端口,但用户习惯访问 `80`(HTTP)或 `443`(HTTPS)端口。
|
||||
|
||||
**Nginx 就像个"门童"**:
|
||||
- 守在 80/443 端口接待客人
|
||||
- 把请求转给后端的 3000 端口
|
||||
- 把结果返回给用户
|
||||
|
||||
<DeploymentNginxDemo />
|
||||
|
||||
**Nginx 配置示例**:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name coffee.example.com;
|
||||
|
||||
# 所有请求都转发给 3000 端口
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. HTTPS:给传输管道“加个盖”
|
||||
## 5. 挂牌:配置域名和 DNS
|
||||
|
||||
以前的网站(HTTP),数据是在网线上“裸奔”的。谁要是拿个工具在中间截获一下,你的密码、聊天记录全都被看见了。
|
||||
现在的标准是 **HTTPS**,多出来的这个 **S** 就是 **Secure (安全)**。它给数据加了一层加密壳,别人截获了也看不懂。
|
||||
房子装修好了,现在要挂个牌子,让客人能找到你。这个牌子就是**域名**。
|
||||
|
||||
### 3.1 反向代理 (Reverse Proxy)
|
||||
### 5.1 域名是什么?
|
||||
|
||||
这是个听起来很高级,其实很简单的概念。
|
||||
你的 Node.js 程序跑在 `3000` 端口,但用户习惯访问 `80` (HTTP) 或 `443` (HTTPS) 端口。
|
||||
你不能让用户自己在网址后面输 `:3000` 吧?
|
||||
域名 = **网站的门牌号**
|
||||
|
||||
这时候就需要 **Nginx** 出场了。它守在 `80/443` 端口,把用户的请求“接”进来,再“转”给你的 `3000` 端口程序。这就叫**反向代理**。
|
||||
- IP地址(123.45.67.89)太难记
|
||||
- 域名(coffee.example.com)好记
|
||||
|
||||
### 3.2 怎么搞定 HTTPS?
|
||||
**DNS(域名解析)** = **电话本**,负责把域名翻译成IP
|
||||
|
||||
不用花钱买证书!现在有免费的工具叫 **Certbot**。
|
||||
它能自动帮你申请证书,还自动帮你改 Nginx 配置。
|
||||
<DeploymentDnsDemo />
|
||||
|
||||
<HttpsNginxDemo />
|
||||
### 5.2 域名配置步骤
|
||||
|
||||
1. **买域名**:在阿里云/腾讯云/Namecheap购买(¥50-100/年)
|
||||
2. **配置DNS记录**:告诉世界"我的网站在这个IP"
|
||||
|
||||
常用记录类型:
|
||||
|
||||
| 记录类型 | 用途 | 示例 |
|
||||
|---------|------|------|
|
||||
| **A记录** | 直接指向IP | `coffee.example.com` → `123.45.67.89` |
|
||||
| **CNAME** | 指向另一个域名 | `www.coffee.example.com` → `coffee.example.com` |
|
||||
|
||||
**注意事项**:
|
||||
- ⏰ DNS生效慢:全球同步需要几分钟到几小时
|
||||
- 📝 TTL值:设置小一点(如600秒),修改后生效快
|
||||
|
||||
---
|
||||
|
||||
## 4. CDN:让网站“飞”到用户家门口
|
||||
## 6. 安防:安装 HTTPS 证书
|
||||
|
||||
如果你的服务器在**北京**,而用户在**纽约**。
|
||||
每一次请求都要跨越半个地球,光是光纤传输就要好几百毫秒,肯定慢。
|
||||
房子好了,牌子挂了,现在要装门锁,保证安全。
|
||||
|
||||
**CDN (内容分发网络)** 就是解决这个问题的。
|
||||
它在全球各地建了无数个“小仓库”。当你把图片、CSS、JS 文件放到 CDN 上:
|
||||
### 6.1 为什么需要 HTTPS?
|
||||
|
||||
- 北京用户访问,CDN 就近从北京节点给他。
|
||||
- 纽约用户访问,CDN 就近从纽约节点给他。
|
||||
<DeploymentHttpsDemo />
|
||||
|
||||
**结果**:你的服务器轻松了(流量少了),用户也爽了(速度快了)。
|
||||
**HTTP 的问题**:数据"裸奔",谁都能看见
|
||||
|
||||
<CdnCacheDemo />
|
||||
**HTTPS 的好处**:数据加密,黑客看见也是乱码
|
||||
|
||||
### 6.2 怎么搞定 HTTPS?
|
||||
|
||||
不用花钱买证书!用 **Let's Encrypt(免费证书)** + **Certbot(自动工具)**
|
||||
|
||||
```bash
|
||||
# 1. 安装 Certbot
|
||||
sudo apt install -y certbot python3-certbot-nginx
|
||||
|
||||
# 2. 自动申请证书并配置 Nginx
|
||||
sudo certbot --nginx -d coffee.example.com
|
||||
|
||||
# 3. 证书自动续期(Certbot会自动设置)
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
完成后,访问网站会看到小锁🔒,HTTPS 就搞定了!
|
||||
|
||||
---
|
||||
|
||||
## 5. CI/CD:告别“手工搬砖”
|
||||
## 7. 招服务员:负载均衡
|
||||
|
||||
以前发布网站是这样的:
|
||||
小明的咖啡店火了,一个人接待不过来,怎么办?招更多服务员!
|
||||
|
||||
1. 在本地改代码。
|
||||
2. 用 FTP 软件把文件上传到服务器。
|
||||
3. SSH 连上去重启服务。
|
||||
4. 哎呀,上传漏了一个文件,报错了!赶紧修...
|
||||
### 7.1 什么是负载均衡?
|
||||
|
||||
这太累,而且容易出错。
|
||||
现在我们用 **CI/CD (持续集成/持续部署)**。
|
||||
<DeploymentLbDemo />
|
||||
|
||||
### 5.1 它是怎么工作的?
|
||||
**负载均衡器(Load Balancer)** = **餐厅领班**
|
||||
|
||||
你只需要做一件事:**把代码推送到 Git 仓库**。
|
||||
剩下的事情,流水线(Pipeline)自动帮你做:
|
||||
- 看着后面N个服务器(服务员)
|
||||
- 把客人分配到最空闲的那个
|
||||
- 某个服务器挂了,自动把流量分给其他的
|
||||
|
||||
1. **检测**:自动发现有新代码了。
|
||||
2. **安装**:自动在新环境里装依赖 (`npm install`)。
|
||||
3. **构建**:自动打包 (`npm run build`)。
|
||||
4. **部署**:自动把打好的包发到服务器,并重启服务。
|
||||
### 7.2 什么时候需要负载均衡?
|
||||
|
||||
如果中间任何一步出错了(比如测试没过),它会立刻停下来报警,绝不会把烂代码发到线上。
|
||||
|
||||
<CicdPipelineDemo />
|
||||
|
||||
### 5.2 进阶:如何“丝滑”回滚?
|
||||
|
||||
万一新版本上线后发现有重大 Bug,怎么办?
|
||||
**蓝绿部署** 或 **滚动更新** 可以帮你。简单说,就是新老版本共存一小会儿,没问题了再全切过去。有问题?一键切回老版本,用户甚至感觉不到。
|
||||
|
||||
<RollbackSwitchDemo />
|
||||
| 访问量 | 服务器配置 | 是否需要LB |
|
||||
|--------|-----------|-----------|
|
||||
| <100/天 | 1核2G | ❌ 不需要 |
|
||||
| 1000-10000/天 | 2核4G | ❌ 不需要 |
|
||||
| >10000/天 | 4核8G | ✅ 建议配置 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 监控与备份:做个“心里有数”的管理员
|
||||
## 8. 开分店:CDN 加速
|
||||
|
||||
网站上线了,不是结束,只是开始。
|
||||
你不能等用户打电话骂你“网站打不开了”,你才知道出事了。
|
||||
小明在全国都有客人,北京的服务器响应纽约的请求太慢了。怎么办?开分店!
|
||||
|
||||
### 6.1 监控 (Observability)
|
||||
### 8.1 什么是 CDN?
|
||||
|
||||
你需要给服务器装上“摄像头”和“报警器”:
|
||||
**CDN(内容分发网络)** = **全球连锁仓库**
|
||||
|
||||
- **日志 (Logs)**:记录程序运行的每一句话。报错了查日志,一查一个准。
|
||||
- **指标 (Metrics)**:CPU 用了多少?内存剩多少?QPS(每秒请求数)是多少?
|
||||
- **告警 (Alerts)**:当 CPU 飙到 90%,或者错误率突然升高时,直接发短信/钉钉告诉你。
|
||||
<DeploymentCdnDemo />
|
||||
|
||||
### 6.2 备份 (Backup)
|
||||
**CDN 的工作原理**:
|
||||
|
||||
**数据是无价的**。
|
||||
一定要设置**自动备份**。哪怕服务器炸了、被黑客删库了,只要有备份,你就能在半小时内“起死回生”。
|
||||
1. 你把图片、CSS、JS等"不变的东西"上传到CDN
|
||||
2. CDN把这些文件复制到全球各地的节点
|
||||
3. 用户访问时,CDN自动从最近的节点给文件
|
||||
|
||||
<ObservabilityBackupDemo />
|
||||
**效果**:
|
||||
- 北京用户 → 北京节点(10ms)
|
||||
- 纽约用户 → 纽约节点(15ms)
|
||||
- 伦敦用户 → 伦敦节点(20ms)
|
||||
|
||||
### 8.2 怎么配置CDN?
|
||||
|
||||
1. **开通CDN服务**:阿里云CDN/腾讯云CDN/Cloudflare
|
||||
2. **添加域名**:填写你的网站域名
|
||||
3. **配置源站**:告诉CDN你的服务器IP
|
||||
4. **刷新缓存**:文件更新后,手动刷新CDN缓存
|
||||
|
||||
---
|
||||
|
||||
## 7. 遇到问题怎么办?(故障速查)
|
||||
## 9. 自动化:建立 CI/CD 流程
|
||||
|
||||
别慌,按这个表排查:
|
||||
每次更新代码都要手动SSH到服务器、拉代码、构建、重启,太累!自动化吧!
|
||||
|
||||
| 现象 | 可能原因 | 怎么办? |
|
||||
| :------------- | :--------------------------------------- | :------------------------------------------------------------------------- |
|
||||
| **打不开网站** | 域名没解析好?服务器挂了?防火墙拦住了? | 1. `ping 域名` 看看通不通。<br>2. 检查云厂商防火墙是不是没开 80/443 端口。 |
|
||||
| **HTTPS 报错** | 证书过期了?没配置好? | 运行 `certbot renew` 试着续期一下。 |
|
||||
| **改了没生效** | 浏览器缓存?CDN 缓存? | 强制刷新浏览器 (Ctrl+F5);去 CDN 控制台点“刷新缓存”。 |
|
||||
| **发布失败** | 依赖装不上?代码写错了? | 去看 CI/CD 的日志,最后几行通常就是原因。 |
|
||||
### 9.1 什么是 CI/CD?
|
||||
|
||||
<DeploymentCicdDemo />
|
||||
|
||||
**CI(持续集成)** = 自动化测试
|
||||
|
||||
- 每次提交代码自动运行测试
|
||||
- 保证代码质量
|
||||
|
||||
**CD(持续部署)** = 自动化上线
|
||||
|
||||
- 代码通过测试后自动部署
|
||||
- 一键上线,安全可靠
|
||||
|
||||
### 9.2 怎么实现 CI/CD?
|
||||
|
||||
**推荐:GitHub Actions**
|
||||
|
||||
在项目根目录创建 `.github/workflows/deploy.yml`:
|
||||
|
||||
```yaml
|
||||
name: Deploy to Production
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Build
|
||||
run: npm run build
|
||||
|
||||
- name: Deploy to server
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: ${{ secrets.SERVER_HOST }}
|
||||
username: root
|
||||
key: ${{ secrets.SSH_KEY }}
|
||||
script: |
|
||||
cd /var/www/coffee-shop
|
||||
git pull origin main
|
||||
npm install
|
||||
npm run build
|
||||
pm2 restart all
|
||||
```
|
||||
|
||||
**工作流程**:
|
||||
1. 小明提交代码到 GitHub
|
||||
2. GitHub Actions 自动触发
|
||||
3. 自动构建 + 自动部署
|
||||
4. 几分钟后,新版本就上线了!
|
||||
|
||||
---
|
||||
|
||||
## 8. 名词速查表 (Glossary)
|
||||
## 10. 守夜人:监控和备份
|
||||
|
||||
| 缩写 | 全称 | 人话解释 |
|
||||
| :-------- | :---------------------------------- | :------------------------------------------------- |
|
||||
| **DNS** | Domain Name System | **域名解析**。把网址变成 IP。 |
|
||||
| **CDN** | Content Delivery Network | **加速网络**。把资源存到离用户最近的地方。 |
|
||||
| **HTTPS** | HyperText Transfer Protocol Secure | **安全协议**。给数据传输加把锁。 |
|
||||
| **CI/CD** | Continuous Integration / Deployment | **自动发布**。提交代码后自动跑完测试和上线流程。 |
|
||||
| **PM2** | Process Manager 2 | **进程管家**。Node.js 的保姆,负责让程序一直跑着。 |
|
||||
网站上线了,但工作还没完。就像开店后需要保安和账房,网站也需要**监控**和**备份**。
|
||||
|
||||
### 10.1 监控:当个好管家
|
||||
|
||||
<DeploymentMonitorDemo />
|
||||
|
||||
**需要监控什么?**
|
||||
|
||||
| 指标 | 说明 | 正常范围 |
|
||||
|------|------|---------|
|
||||
| **CPU使用率** | 服务器"脑子"有多忙 | <70% |
|
||||
| **内存使用率** | 服务器"记忆"占多少 | <80% |
|
||||
| **磁盘空间** | 硬盘还剩多少 | <80% |
|
||||
| **响应时间** | 网页加载多慢 | <2秒 |
|
||||
| **错误率** | 有多少请求失败 | <1% |
|
||||
|
||||
**监控工具推荐**:
|
||||
- **基础监控**:云厂商自带的监控(阿里云云监控/腾讯云云监控)
|
||||
- **APM监控**:New Relic / Datadog(收费,功能强大)
|
||||
- **开源方案**:Prometheus + Grafana(免费,需自建)
|
||||
|
||||
### 10.2 备份:最后的安全网
|
||||
|
||||
**数据是无价的**!一定要定期备份。
|
||||
|
||||
<DeploymentBackupDemo />
|
||||
|
||||
**备份三要素**:
|
||||
|
||||
1. **定期备份**:每天凌晨自动备份(用户访问少的时候)
|
||||
2. **多地存储**:本地 + 异地(防止单点故障)
|
||||
3. **定期恢复测试**:备份了要确保能恢复
|
||||
|
||||
**备份策略**:
|
||||
|
||||
```bash
|
||||
# 每天自动备份数据库
|
||||
0 2 * * * /usr/bin/mysqldump -u root -p密码 coffee_shop > /backup/db_$(date +\%Y\%m\%d).sql
|
||||
|
||||
# 保留最近7天的备份
|
||||
find /backup -name "db_*.sql" -mtime +7 -delete
|
||||
|
||||
# 自动上传到云存储(如阿里云OSS)
|
||||
/usr/bin/ossutil cp /backup/db_$(date +\%Y\%m\%d).sql oss://my-backup/db/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 上线前的最后检查 (Checklist)
|
||||
## 11. 故障排查:遇到问题怎么办?
|
||||
|
||||
在按下“发布”按钮前,心里默念一遍:
|
||||
网站出问题了,别慌,按这个流程排查:
|
||||
|
||||
- [ ] **域名**:解析通了吗?IP 对吗?
|
||||
- [ ] **安全**:HTTPS 绿锁有了吗?
|
||||
- [ ] **加速**:CDN 配好了吗?静态资源快吗?
|
||||
- [ ] **流程**:自动发布跑通了吗?能一键回滚吗?
|
||||
- [ ] **后路**:监控报警开了吗?数据库备份了吗?
|
||||
### 11.1 排查流程图
|
||||
|
||||
如果都 OK,恭喜你,你的产品正式面世了!🚀
|
||||
<DeploymentTroubleshootDemo />
|
||||
|
||||
### 11.2 常见问题速查表
|
||||
|
||||
| 现象 | 可能原因 | 怎么办 |
|
||||
|------|---------|--------|
|
||||
| **网站打不开** | 域名没解析?服务器挂了? | `ping 域名` 看通不通<br>`ssh` 连不上就是服务器挂了 |
|
||||
| **404 Not Found** | Nginx配置错了?文件路径不对? | 检查 `nginx -t` 配置<br>看看 `root` 路径对不对 |
|
||||
| **502 Bad Gateway** | 后端服务挂了?端口没开? | `pm2 list` 看服务在不在<br>`netstat -tlnp` 看端口监听 |
|
||||
| **HTTPS证书报错** | 证书过期了?域名不匹配? | `certbot renew` 续期<br>检查证书域名是否正确 |
|
||||
| **更新不生效** | 浏览器缓存?CDN缓存? | Ctrl+F5 强制刷新<br>去CDN控制台"刷新缓存" |
|
||||
| **很慢** | 服务器性能不够?CDN没配置? | 查监控看CPU/内存<br>静态资源上CDN |
|
||||
|
||||
---
|
||||
|
||||
## 12. 上线前最后检查
|
||||
|
||||
小明终于要正式开业了!在按下"发布"按钮前,再检查一遍:
|
||||
|
||||
<DeploymentChecklistDemo />
|
||||
|
||||
### 最终检查清单
|
||||
|
||||
**基础检查**:
|
||||
- [ ] 代码已经构建(`npm run build`)
|
||||
- [ ] 服务器环境配置完成(Nginx + Node.js)
|
||||
- [ ] 域名解析正确(能ping通)
|
||||
- [ ] HTTPS证书正常(有🔒小锁)
|
||||
|
||||
**性能检查**:
|
||||
- [ ] 首屏加载时间 <2秒
|
||||
- [ ] 图片已经压缩优化
|
||||
- [ ] CDN配置完成
|
||||
- [ ] 开启了Gzip压缩
|
||||
|
||||
**安全检查**:
|
||||
- [ ] 数据库密码不是弱密码
|
||||
- [ ] 敏感信息没写在代码里
|
||||
- [ ] 开启了防火墙(只开必要的端口)
|
||||
- [ ] 配置了SQL注入防护
|
||||
|
||||
**运维检查**:
|
||||
- [ ] 监控告警配置完成
|
||||
- [ ] 日志正常记录
|
||||
- [ ] 自动备份已设置
|
||||
- [ ] CI/CD流程测试通过
|
||||
|
||||
**应急预案**:
|
||||
- [ ] 准备了回滚方案
|
||||
- [ ] 有故障联系机制
|
||||
- [ ] 备份恢复测试通过
|
||||
|
||||
---
|
||||
|
||||
## 13. 总结:服务上线的关键点
|
||||
|
||||
小明的咖啡店网站终于上线了!让我们回顾一下整个过程:
|
||||
|
||||
### 核心流程
|
||||
|
||||
1. **构建**:把代码打包成浏览器懂的格式
|
||||
2. **部署**:把代码放到服务器上
|
||||
3. **配置**:Nginx、域名、HTTPS
|
||||
4. **优化**:CDN、负载均衡
|
||||
5. **自动化**:CI/CD解放双手
|
||||
6. **保障**:监控和备份守住底线
|
||||
|
||||
### 关键原则
|
||||
|
||||
| 原则 | 说明 |
|
||||
|------|------|
|
||||
| **小步快跑** | 先上线MVP(最小可用产品),再逐步完善 |
|
||||
| **自动化优先** | 能自动的别手动,减少人为失误 |
|
||||
| **监控先行** | 先建监控,再上功能 |
|
||||
| **备份为王** | 数据无价,备份是最后的防线 |
|
||||
| **安全第一** | HTTPS、防火墙、弱密码检查,一个都不能少 |
|
||||
|
||||
### 学习路线
|
||||
|
||||
**入门**(第1天):
|
||||
- 用 Vercel/Netlify 免费部署一个静态网页
|
||||
|
||||
**进阶**(第1周):
|
||||
- 租一台云服务器
|
||||
- 手动部署一个 Node.js 应用
|
||||
- 配置域名和 HTTPS
|
||||
|
||||
**实战**(第2-4周):
|
||||
- 搭建完整的 CI/CD 流程
|
||||
- 配置 CDN 加速
|
||||
- 建立监控和备份体系
|
||||
|
||||
**深入**(持续):
|
||||
- 学习 Docker 容器化部署
|
||||
- 研究 Kubernetes 集群管理
|
||||
- 探索微服务架构
|
||||
|
||||
---
|
||||
|
||||
## 名词速查表
|
||||
|
||||
| 名词 | 英文 | 人话解释 |
|
||||
|------|------|---------|
|
||||
| **部署** | Deployment | 把代码放到服务器上让人能访问 |
|
||||
| **构建** | Build | 把源代码翻译打包成浏览器懂的格式 |
|
||||
| **服务器** | Server | 一台永远不关机、连着互联网的电脑 |
|
||||
| **域名** | Domain Name | 网站的好记名字(如 baidu.com) |
|
||||
| **DNS** | Domain Name System | 域名解析系统,把域名翻译成IP |
|
||||
| **IP地址** | IP Address | 电脑在互联网上的门牌号 |
|
||||
| **HTTP** | HyperText Transfer Protocol | 网页传输协议(不安全) |
|
||||
| **HTTPS** | HTTP Secure | 安全的网页传输协议(加密) |
|
||||
| **Nginx** | Engine X | 一个高性能的Web服务器(门童) |
|
||||
| **反向代理** | Reverse Proxy | 转发请求到后端服务 |
|
||||
| **SSH** | Secure Shell | 远程连接服务器的工具 |
|
||||
| **CDN** | Content Delivery Network | 内容分发网络,全球加速 |
|
||||
| **负载均衡** | Load Balancing | 把流量分到多台服务器 |
|
||||
| **CI/CD** | Continuous Integration/Deployment | 持续集成/持续部署(自动化) |
|
||||
| **监控** | Monitoring | 盯着服务器看有没有问题 |
|
||||
| **备份** | Backup | 复份数据,防丢失 |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user