TL;DR
在容器化/受限环境里,systemctl reload caddy 可能因 PrivateTmp=true 的命名空间挂载失败(status=226/NAMESPACE)。此时 Caddy 进程仍健康,可直接用 caddy reload --config ... --adapter caddyfile 走管理 API 热加载,无需重启。
一、现象
修改 /etc/caddy/Caddyfile 后执行:
systemctl reload caddy
失败:
Failed to create destination mount point node '/run/systemd/unit-root/tmp': No such file or directory
Failed at step NAMESPACE spawning /usr/local/bin/caddy: No such file or directory
但 systemctl status caddy 显示进程 active (running),旧配置仍在服务。
二、原因
Caddy 官方 systemd 单元带 PrivateTmp=true,reload 时需要为子进程重建临时目录挂载命名空间;在部分 VPS/容器内核环境下该路径不可用,导致 ExecReload 失败。属于环境问题,不是配置语法问题。
三、解决
先用 caddy validate 确认语法:
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
再直接调用管理 API 热加载:
caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile
Caddy 运行时会监听 127.0.0.1:2019 管理接口,reload 命令会把新配置推送过去,进程不重启、连接不中断。
四、验证
curl -H "Host: example.com" http://127.0.0.1/
确认新页面生效,且既有 WebSocket/代理路径仍然工作。
五、注意事项
- 修改前先备份原配置。
- 若环境持续复现,可考虑把
PrivateTmp=false写入 drop-in 覆盖,但这会改变服务隔离,谨慎评估。 - 热加载失败时进程仍服务旧配置,适合先 reload 再决定是否重启。
结论
systemd 的 reload 失败不等于 Caddy 不可用;管理 API 热加载是更可控的路径。