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

部署:从"能跑"到"敢托管"

XServer 的部署简单到只剩"拷目录"——难的部分全在服务化:开机自启、崩溃重启、优雅停机的外部兜底。本章含 home 生产环境的真实脚本。

本章导读

站位:运维视角的最后一公里。ch06 讲过的"停机无超时强拆"在这里兑现为服务管理器的配置项。

42.1 引入

部署 XServer 应用没有依赖清单、没有环境准备、没有安装步骤——这些在第 2 章就被折叠掉了。剩下的运维问题只有三个:放哪(目录规划)、怎么常驻(服务管理器)、怎么体面地停(优雅停机 + 外部超时)。本章逐一处理。

42.2 交付物与运行目录

home 生产布局(真实形态)出处:home 仓库 /opt/www
/opt/www/                  /* 部署根 = 可执行目录 = 配置目录 */
├── xs                     /* 唯一二进制(含编译器/SDK/运行时)*/
├── xs.json                /* 总配置:services + 全部 vhost */
├── host/default/...       /* 站群(ch20 的布局)*/
├── host/xxdevs/...
├── tools/  dev/           /* 运维辅助与开发备份 */
└── (无其他任何依赖)
  • 版本化:整个目录是一个单元——回滚 = 换回上一个目录副本(xs.exe 与源码/配置永远同版)
  • 更新路径:结构变更 = 拷入新目录重启;日常更新 = 覆盖脚本文件 + reload(分钟级变更纪律,ch31)
  • 数据隔离:db/ 在站群目录内——备份策略按目录做即可

42.3 服务化管理

home 生产的真实启动脚本(仓库原文):

xs.service(home 原文,SysV 风格)生产实样出处:home/xs.service
#!/bin/sh
case "${1}" in
  start)
    cd /opt/www
    sudo nohup /opt/www/xs /opt/www/xs.json &
    ;;
  stop)
    sudo pkill -9 -f /opt/www/xs        /* 注意:-9 硬杀 */
    ;;
  restart)
    sudo pkill -9 -f /opt/www/xs
    cd /opt/www; sudo nohup /opt/www/xs /opt/www/xs.json &
    ;;
esac

刚才发生了什么:这个脚本展示了最小可行形态,也暴露了一个改进点——pkill -9 是硬杀,跳过了优雅停机(ch06 的五阶段)。推荐形态是 systemd 单元,让先礼后兵成为默认:

推荐:xs.service(systemd 单元)
[Unit]
Description=xs application server
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/www
ExecStart=/opt/www/xs /opt/www/xs.json
/* 优雅停机:先 SIGTERM 给足时间,超时才 SIGKILL */
KillSignal=SIGTERM
TimeoutStopSec=120
Restart=on-failure
RestartSec=3
/* 输出接入 journald;应用内可用 xrtLogger 做分级 */
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Windows 侧对等物:服务包装器(或计划任务 + net stop 走 CTRL_BREAK 的进程组信号,test.bat 的 wingrp 工具就是干这个的)。

42.4 停机纪律

  • 内部:SIGTERM/Ctrl+C → 五阶段优雅停机(ch06)——没有超时强拆,长连接等到底
  • 外部:服务管理器提供兜底——systemd 的 TimeoutStopSec、supervisor 的 stopwaitsecs。给多长?略大于你最长的合法请求(如大文件下载上限 + 缓冲)
  • 顺序:滚动更新的节奏是"新实例就绪 → 切流 → 旧实例 SIGTERM → 等排空 → 兜底强杀"

42.5 契约

  • 目录线:部署根 = exe = 配置;整目录版本化,回滚即换目录。
  • 服务线:常驻交给服务管理器;Restart=on-failure 是崩溃兜底。
  • 停机线:内部优雅 + 外部超时,缺一不可。

常见错误

直接 kill -9 当常规手段
症状
每次"发布"都断所有连接,用户以为宕机。
原因
-9 跳过优雅路径——ServiceUnit 没跑、在途请求被腰斩。SIGTERM 是常规手段,-9 只属于兜底。
配置了 WorkingDirectory 就以为路径随便写
症状
部分机器上"找不到 xs.json / 静态根"。
原因
XServer 默认在 可执行文件所在目录找配置(ch02)——WorkingDirectory 只影响相对 CWD 的操作。保持"传全路径给 xs.json"或统一目录布局,别依赖 CWD。

编程练习

基础systemd 上线

按 42.3 单元把自己的应用注册成系统服务。

验收:start/stop/status/开机自启全通;stop 日志含完整五阶段。
进阶停机窗口实测

压测 + 大文件下载进行中 stop,调 TimeoutStopSec 找到"零失败"的最小值。

验收:给出你的业务的推荐停机窗口与依据。
挑战蓝绿目录

实现蓝绿发布脚本:双目录 + 切换符号链接 + 旧实例排空。

验收:全流程可用率 100%;回滚一条命令。

小结

要点结论
交付部署根 = exe = 配置;整目录版本化
常驻systemd:Restart 兜崩溃,journal 收日志
停机SIGTERM 优雅 + TimeoutStopSec 外部兜底
发布日常 reload / 结构变更换目录重启 / 蓝绿滚动
本章涉及的 API 参考
xrt 延伸阅读