运维体系
这个站点背后的每一层设计,以及为什么这么选。
部署架构
/var/www/releases/<时间戳>-<标签>/ 不可变发布物,每个版本独立
/var/www/personal-site 软链接 → 当前生效版本
/var/www/releases/.current 当前版本指针
/var/www/releases/.history 版本历史(回滚依据)
用软链接而不是直接覆盖文件,因为覆盖是破坏性的:
切一半失败会得到半新半旧的状态。软链接切换是
原子的(mv -T 的 rename 语义),
要么全新要么全旧,没有中间态。
发布流程(9 步,每步失败都不留半成品)
| 步骤 | 动作 | 失败时 |
|---|---|---|
| 1 | 校验源目录(必须有 index.html) | 拒绝发布 |
| 2 | 记录回滚点 + 备份 nginx 配置 | 中止 |
| 3 | 创建新 release 目录(cp -a) | 中止 |
| 4 | 权限预检(以 nginx 用户试读) | 删除新目录,中止 |
| 5 | nginx -t 语法校验 | 删除新目录,中止 |
| 6 | 原子切换软链接 | — |
| 7 | reload(非 restart) | — |
| 8 | 健康检查 5 次 | 自动回滚 |
| 9 | 清理旧版本(保留 5 个) | 跳过生效版本 |
为什么是 reload 而不是 restart
| 方式 | 总请求 | 失败 | master 进程 |
|---|---|---|---|
reload | 25,496 | 0 | 保留 |
restart | 25,612 | 408 | 更换 |
restart 的 408 个失败(393 个 connection refused +
15 个 connection reset)不是"顺带发现",而是刻意设计的对照组——
它证明我的压测方法确实能检测到服务中断,
所以 reload 的零失败才是可信证据。
流量防护(按 20 GB/月 额度设计)
CDT 免费额度按地域区分:中国内地 20 GB/月, 非中国内地 200 GB/月。本机在青岛,所以额度是 20 GB ≈ 682.7 MB/天。
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req zone=general burst=20 nodelay;
limit_conn perip 20;
limit_req_status 429;
取值依据:真人浏览瞬时峰值约 10–20 请求/秒,自动化工具通常 100+ 请求/秒,
所以 10r/s + burst=20 只挡后者。
双向验证(只测"能拦住"是不完整的——过严的限流赶走真人更糟):
| 实验 | 负载 | 结果 |
|---|---|---|
| A 正常用户 | 2 请求/秒 × 10 | 10/10 成功,零误伤 |
| B 攻击负载 | 8 并发,2320 QPS | 11,547 个被 429 拦截 |
监控与告警
lib/traffic-monitor.py 日志分析引擎(纯标准库)
bin/traffic-check.sh 阈值判定 + 告警
/etc/cron.d/ops-lab-traffic 每小时巡检
/etc/cron.d/ops-lab-daily-report 每日日报
logs/traffic/ 历史报告(自动保留 48 份)
logs/alerts/ 告警记录
阈值来自额度换算而非拍脑袋:20GB ÷ 30 天 = 682.7 MB/天,
50% 警告、80% 严重。
测量局限(这点很重要):/proc/net/dev 的计数
包含内网流量——阿里云 agent 大量发往
100.64.0.0/10 内部服务网,不出机房、不计费。
实测站点出流量只占 eth0 发送量的 5.58%,真实计费数字要看控制台 CDT。
技术选型理由
| 选择 | 理由 |
|---|---|
| nginx 直跑静态文件 | 内存 14.8 MB;Node/Python 后端起步 50–100 MB |
| 不用 Docker 跑网站 | 多一层 overlayfs 与网络命名空间开销,2 GB 内存要留给其他练习 |
| 不用宝塔面板 | 本项目目的是理解各组件的手动配置过程。面板自动生成的配置不透明,出问题时需先弄清它的生成逻辑才能定位;这类工具更适合快速建站场景,与练习目的不同 |
| 自研 Markdown 转换器 | 服务器软件越少攻击面越小;且零依赖可审计 |
| CSS 内联进 HTML | 省一次 HTTP 请求,弱网下体感明显,也少一次被限流的可能 |
工具集
| 工具 | 用途 |
|---|---|
backup-config.sh | 改配置前自动备份(保留 30 份) |
healthcheck.sh | 一键系统巡检 |
deploy.sh | 原子发布(9 步 + 自动回滚) |
rollback.sh | 秒级回滚 |
traffic-check.sh | 流量巡检 + 分级告警 |
loadtest.py | 标准库并发压测器(支持按时长) |
md2html.py | Markdown 转换器(含 XSS 防护,55 项测试) |