第 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 延伸阅读
- xrt 参考 · signal — 信号处理的平台差异(宿主已为你处理)