触发条件

在 ~/workspace/platform/nginx/routes.json 里改路由后,跑 ./deploy.sh 第一次,新配置没有生效。

症状

deploy.sh 输出 ✅ 部署成功、nginx -t 通过、systemctl reload nginx 执行,但 curl 验证时行为还是旧配置(例如新加的 auth_basic 不生效,无凭据仍返回 200)。

根因

deploy.sh 第 4 步的复制顺序有 bug:

sudo cp sites/6767.chat.conf.new /etc/nginx/platform/sites/6767.chat.conf   # ① /etc 先拿到新配置
sudo cp sites/*.conf /etc/nginx/platform/sites/                            # ② 又把 sites/6767.chat.conf(旧的)覆盖回 /etc
...
cp sites/6767.chat.conf.new sites/6767.chat.conf                           # ③ 最后才把 .new 同步进 sites/(供 git)

第 ② 步的 sites/*.conf 通配会把旧的 sites/6767.chat.conf 盖掉第 ① 步刚写入的新配置。等第 ③ 步同步完,sites/ 里才是新配置。

最终解决

(2026-08-12 已在 deploy.sh 中修复) 把第 23 行的 git 同步 cp sites/6767.chat.conf.new sites/6767.chat.conf 挪到第 21 行 sudo cp sites/*.conf /etc/... 之前,这样通配复制时 sites/6767.chat.conf 已是新配置。修复后一次 deploy 即正确(验证:/etc 与生成结果 diff 一致)。

修复前遇到此 bug 时:再跑一次 ./deploy.sh 即可——第二次时 sites/6767.chat.conf 已经是新配置(上次第 ③ 步同步过了),第 ② 步盖回去的也是新的。

下次如何识别

  • 改 routes.json 后 deploy 一次,验证不对 → 不要怀疑配置写错,先再 deploy 一次。
  • 确认用 sudo nginx -T | grep -n -A3 'location ... /codex/' 看 nginx 实际生效的配置(不是 sites/ 源文件)。
  • reload 后旧 worker 可能还在 draining(ps 里可见 worker process is shutting down),验证要等一下或直接看响应头。

相关概念

  • kanna 部署(workspace/platform/docs/projects/kanna.md)
  • nginx 站点配置由 routes.json 经 generate-config.cjs 生成,deploy.sh 负责测试/部署/重载

本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network