platform deploy.sh 首次部署不生效 (Nginx Deploy Copy-Order Bug)
触发条件
在 ~/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