---
title: "12.4 运维基础与成本优化"
---

# 12.4 运维基础与成本优化

> **本节目标**：建立运维意识，学会监控应用状态、控制成本、避免账单惊喜。

小明的"个人豆瓣"上线一周了。一切看起来很正常——直到老师傅问了一句："你知道有多少人在用吗？出了问题你怎么知道？"

小明愣住了。他只知道网站"能打开"，但具体有多少人访问、有没有报错、数据库连接是否正常——一概不知。

**上线不是终点，是运维的起点。** 你的应用现在 24 小时跑在公网上，需要有人"看着"它。

## 上线之后谁来看着它

对个人开发者来说，"运维"听起来很重，但核心就三件事：

1. **知道应用是否正常**——有人访问吗？有报错吗？
2. **出问题能快速定位**——哪里出了问题？什么时候开始的？
3. **变更时降低风险**——新功能上线前先小范围测试

这三件事不需要你 24 小时盯着屏幕。部署平台已经帮你做了大部分工作，你只需要知道去哪里看。

## 看懂你的数据

部署平台通常提供一个分析面板，展示你的应用运行状态。

![image-20260302021249583](/images/Advanced/image-20260302021249583.png)

不同平台的分析面板位置不同：
- **EdgeOne**：控制台 → 项目 → 数据分析
- **Vercel**：Dashboard → 项目 → Analytics
- **Cloudflare**：Dashboard → Workers & Pages → 分析

## 日志：出了问题去哪里看

有一天，小明的朋友发来消息："你的网站打不开了，一直转圈。"小明自己试了一下，确实很慢。

这时候就需要看**日志**了。日志就像行车记录仪——出了事故回放一下就知道怎么回事。

小明打开 EdgeOne 的部署日志，找到了这样一行：

```
Error: Connection timed out - database not responding
```

原因很清楚：数据库连接超时了。小明去 Neon 控制台一看，免费版的数据库因为长时间不活跃被暂停了。重新激活后，网站恢复正常。

**日志排查的套路很简单：**

1. 先看有没有红色的 ERROR
2. 找到报错时间点前后的上下文
3. 如果看不懂，把关键信息复制给 Claude Code 帮你分析

各平台的日志查看方式：
- **EdgeOne**：控制台 → 项目 → 部署日志 + 运行日志
- **Vercel**：Dashboard → 项目 → Logs，可以按时间和关键词筛选
- **Cloudflare**：Dashboard → Workers & Pages → 实时日志

![image-20260302021359067](/images/Advanced/image-20260302021359067.png)

## 平台已经帮你做的优化

Serverless 平台默认做了很多事，你不需要操心：

**自动扩缩容**——就像你手机的亮度自动调节：光线强时调暗，光线弱时调亮，你不需要手动拨滑块。传统服务器需要你提前猜"我的网站需要几台服务器"，猜少了扛不住流量，猜多了白花钱。Serverless 平台根据实际访问量自动调整资源，你完全不用操心。

**全球 CDN**——静态资源（HTML、CSS、JS、图片）自动分发到全球节点。用户访问时，CDN 会从离他们最近的节点返回内容，而不是每次都请求源服务器。

**图片优化**——自动压缩图片、转换成更高效的格式（WebP/AVIF）。你上传一张 2MB 的 PNG，用户实际下载的可能只有 200KB。

**HTTPS**——自动申请和续期 SSL 证书。你不需要手动配置 HTTPS，平台默认就是安全连接。

这些优化在传统服务器上需要你自己配置 Nginx、Let's Encrypt、CDN 服务……现在平台全包了。

## 你可以关注的优化

当用户反馈"慢"的时候，可以让 Claude Code 帮你检查：

> "分析我的网站性能，给出优化建议"

常见的优化方向：

**图片太大**——首屏加载慢。使用 `next/image` 组件，它会自动根据设备尺寸返回合适大小的图片。

**接口太慢**——页面白屏时间长。检查数据库查询是否缺少索引，或者是否有 N+1 查询问题。这些在第六章数据库那一节提过。

**包体积大**——JS 文件过大，下载时间长。检查是否引入了不必要的库。告诉 Claude Code "分析我的 bundle 大小，找出最大的依赖"。

**无缓存**——重复请求相同数据。添加适当的缓存策略，让浏览器和 CDN 缓存不常变化的内容。

## 成本：免费额度够用吗

小明用的都是免费套餐，目前一分钱没花。但老师傅提醒他："免费额度是用来体验的，不是用来长期跑生产的。你得知道什么时候会开始花钱。"

### 分阶段决策

老师傅反复强调：**不要在阶段一担心阶段三的问题。**

**MVP 阶段（< 1,000 用户）**——用 Serverless 免费套餐，月成本 ¥0。这个阶段的重点是验证产品，不是优化成本。

**增长期（1,000 - 10,000 用户）**——免费额度可能不够了，需要升级到付费套餐。月成本大概 ¥50-200，取决于流量和功能使用量。这个阶段开始关注成本趋势。

**规模化（> 10,000 用户）**——评估是继续用托管服务还是自建。这个阶段的决策需要根据具体业务来判断，不在本章讨论范围。

### 免费额度

**Vercel** 的免费版限制每个请求最多跑 10 秒。你在 Next.js 里写的 API Route（比如 `/api/books`），部署到 Vercel 后就变成了一个 Serverless Function。对大多数接口来说 10 秒绑绑有余，但如果你的接口要查大量数据或调用外部 AI API，10 秒可能不够。超时后用户会看到一个白页和"504 Gateway Timeout"错误——意思是"服务器处理太久，放弃了"。解决方案是优化接口性能，或者升级到 Pro 套餐（执行时长提升到 60 秒）。

**Neon** 的免费版计算时长有限，长时间不活跃的数据库会被暂停。下次访问时需要"冷启动"，首次请求会慢 1-2 秒。这就是小明之前遇到的"网站打不开"的原因之一。

**Supabase** 的免费版只能创建 2 个项目，而且会暂停 7 天不活跃的项目。如果你有多个项目在跑，免费版很快就不够用了。

### AI 模型成本

如果你的应用调用了 AI API（比如 OpenAI、Claude、GLM），模型成本可能是最大的开销。老师傅建议在 API 平台设置每日或每月消费上限，防止因为代码 bug（比如死循环调用 API）导致天价账单。

## 轻量级灰度发布

序言里提到过灰度发布的概念——先给一部分用户推送新版本，确认没问题再全量发布。

对个人项目来说，你不需要复杂的灰度系统。**预览链接 → 测试 → 合并**就是最简单的灰度流程：

1. 在功能分支上开发新功能
2. 创建 PR，平台自动生成预览链接
3. 自己和朋友在预览链接上测试
4. 确认没问题，合并 PR 到 `main`，自动部署到生产环境

这个流程在 12.3 已经讲过了。它不是严格意义上的灰度发布，但对个人项目来说足够了——新功能上线前，至少有人测试过。

---

::: info 本章总结
你已经学会了从部署到运维的完整流程：选择平台 → 配置部署 → 自动化 CI/CD → 监控和优化。接下来在 [第十三章](../13-domain-dns/index.md) 中，你会给应用绑上自己的域名，让它看起来更专业。
:::
