-今日
-本周
-本月
-累计
项目工作台运维 个人项目与实践记录

运维体系

这个站点背后的每一层设计,以及为什么这么选。

部署架构

/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 用户试读)删除新目录,中止
5nginx -t 语法校验删除新目录,中止
6原子切换软链接
7reload(非 restart)
8健康检查 5 次自动回滚
9清理旧版本(保留 5 个)跳过生效版本

为什么是 reload 而不是 restart

方式总请求失败master 进程
reload25,4960保留
restart25,612408更换

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 请求/秒 × 1010/10 成功,零误伤
B 攻击负载8 并发,2320 QPS11,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.pyMarkdown 转换器(含 XSS 防护,55 项测试)