Ubuntu unattended-upgrades 把 nginx 升到 1.24.0-2ubuntu7.10,worker 全线 SIGSEGV,一条 apt upgrade 修好
来源:When Your Web Server Patches Itself Into a Wall
现象
2026 年 6 月 9 日,一台托管两个 Ghost CMS 发布站的 Linode VPS 例行重启,之后两个站点都开始间歇性不可达。前端有时能打开,但行为不一致。Ghost 管理后台 /ghost/ 加载出来是一片空白——标签页标题还是「Ghost」,画布是空的。SSH 会话空闲一两分钟后就会断开。
问题跟站点本身、配置、数据都无关。是 Ubuntu 自带的安全更新管道悄悄送进来一个坏掉的包,而修复只需要一条 apt upgrade。诊断花了两小时,因为当时的症状同时指向五个不同方向。
诊断
直接原因:nginx worker 在每个请求上都崩溃。nginx error log 里满屏都是同一行:
signal 11
signal 11 就是 SIGSEGV,段错误。nginx master 进程活着,80 和 443 都还在监听——所以 systemctl status nginx 报告 active (running),监听套接字检查看起来也一切正常——但它 fork 出来的每个 worker 一收到请求就立刻崩。master 重新拉一个 worker,下一个请求又把它打崩,这个循环每两秒重复一次。日志是一堵一模一样的崩溃墙,每一行换了新的 PID,signal 11 不变。
worker 段错误不是配置错误,是代码层面的 bug:要么在 nginx 本身,要么在动态加载的模块里。
根因
Ubuntu 的 unattended-upgrades 在重启前的某个时刻自动装上了 nginx 1.24.0-2ubuntu7.10——一个安全补丁。这个 .10 版本带了一个回归,会让 worker 进程在特定条件下 segfault。服务器重启时会自动用新二进制拉起 nginx,症状就是从那一刻开始的。
修复其实已经在队列里了:
apt list --upgradable
输出显示 nginx 的每一个包都有 .11 版本可用——正是针对这个回归的点修复。升级之后,error log 里不再出现 signal 11 崩溃,两个站点立刻恢复正常。
第二个问题:Ghost 后台白屏
还有第二个独立问题:Ghost admin 静态资源与 Node 运行时版本不匹配(Node runtime drift),导致 /ghost/ 管理面板加载成空白页。
结论
不那么体面但更有用的做法是:重启之后,先查包和服务,再查别的。重启后故障最可能的原因就是最近一次变更,而在跑了 unattended-upgrades 的机器上,最近一次变更就是你不在看的时候包管理器干的事。一条十秒钟的检查
apt list --upgradable | grep nginx
本可以让那两小时的诊断完全省掉。