第 47 章 / 共 51 章
卷五 · 扩展、运维与实战

实战三:多 vhost 站群(复刻 home)

一个进程运营一片站点——最后一个实战把"部署形态"本身作为项目:按生产标准搭一个五站混布站群。

本章导读

站位:运维向毕业项目。ch20 讲了组织法,本章按生产标准走一遍全流程——蓝本是 home 仓库(14 vhost 的真实生产,我们做 5 站教学版)。

47.1 项目目标

站点类型练什么
default(兜底)静态导航页最低风险兜底纪律(ch20)
www 主站动态(脚本+模板+db)实战一的成果挂载
api 子域动态(REST)域名分流 + 限额独立
docs 文档站纯静态(devlang=static)零脚本站点形态
admin 管理站动态(内网绑定)管理面隔离(ch27/39)

47.2 搭站群

  • 布局:ch20/37 的 host 目录自包含约定——五目录 + 单 xs.json + 单 exe
  • 配置:单 server 双端点(80/443)全收;五 host 的域名、证书、Custom 旋钮(api 站收紧 body_limit;docs 站配 static 四旋钮)
  • 共享模块:www 与 api 复用 modules/(拷贝式,ch20)——注意两站的 Custom 键名互不干扰
  • 管理站内网化:admin 站域名不进公网 DNS + 防火墙限制源 IP + 令牌(三层叠防)
验收点 1:五站各自命中(Host 头/SNI 测试);未命中域名落 default 导航页;docs 站零脚本进程内痕迹(无 script loaded 行)。

47.3 单站热更新

站群的热重载纪律是"最小爆炸半径":

  • 日常:只对目标 host 提交(admin 站的 /admin/reload → xsReloadHostSubmit)
  • 验证:其余四站持续压测,零错误零感知(未变更站完全不参与——ch20 的配置级分流)
  • 连带更新:共享 modules/ 改动波及多站时按序逐站 reload(不是 all)——滚动而非齐步
  • 演练:证书续期(docs 站换证书零断连)、坏脚本回滚(api 站提交坏脚本 → FAILED → 旧版无损)
验收点 2:四站压测下单站 reload 三轮零失败;证书热替换 openssl 对比验证。

47.4 统一巡检与证书

  • 巡检路由:admin 站实现 /status——枚举全部 server/host 输出 RunState、代数、请求计数(ch11 查询 API + ch43 模式)
  • 证书台账:/status 附各 host 证书的到期日(x509 解析)——续期提醒进运营日历
  • 日志聚合:五站日志统一前缀 [站点名],journald 侧按站过滤

47.5 验收清单

维度标准
路由五站精确命中 + default 兜底 + 三来源一致
隔离单站 reload 零外溢;Custom 互不干扰
安全管理站三层叠防;44.4 清单全过
运维巡检路由 / 证书台账 / 分站日志可用
部署systemd + 停机窗口 + 蓝绿脚本(ch42 挑战的产出)

常见错误

all 一把梭
症状
改一个站的文案提交 xsReloadAllSubmit,五站全部换代。
原因
all 是"全局配置变更"的整批事务(ch26),不是偷懒的默认项。多站换代 = 多倍编译 + 多份 GC,放大每项风险。
共享模块忘了同步多站
症状
修复了 www 站的 ReplyJSON bug,api 站还在旧版。
原因
拷贝式复用的代价(ch20)——共享模块变更要有"波及清单"(哪些站拷了它),按清单逐站滚动。

编程练习

基础五站上线

按 47.2 完成站群搭建与验收点 1。

验收:验收点 1 全过。
进阶运营闭环

完成 47.3/47.4:单站热更 + 巡检路由 + 证书台账。

验收:验收点 2 全过;/status 能预警 30 天内到期的证书。
挑战扩到十四站

参照 home 的真实清单把站群扩到 14 个 vhost(含多个纯静态站),验证配置与运营流程的规模化。

验收:启动 < 3s;巡检路由覆盖全部站点;运营文档更新。

小结

要点结论
形态单进程五站混布:动静分离、管理内网化
热更纪律最小爆炸半径:逐站提交,共享变更滚动
运营巡检路由 + 证书台账 + 分站日志
规模验证教学五站 → 生产 14 站(home 实证)
xrt 延伸阅读
  • xrt · x509 — 证书到期日解析(台账功能)