Apache 无缝升级通过 DocumentRoot 指向符号链接 current 实现,原子替换其目标至新版本目录(如 releases/20260821-0915),无需重启;配置中固定使用 /var/www/myapp/current,禁用 .htaccess,配合权限统一与 OPcache 清理确保平滑切换。

Apache 的 DocumentRoot 本身不支持“无缝切换”或“版本滚动”,它只是静态指向一个物理路径。真正的无缝升级靠的是**让 DocumentRoot 指向一个固定的符号链接,再通过原子化替换该链接的目标目录**来实现——整个过程无需重启 Apache,请求在切换瞬间就自动流向新版本。
目录结构设计:分离固定入口与动态版本
核心是把部署路径解耦为三层:
-
固定入口:如
/var/www/myapp/current—— 这就是 DocumentRoot 实际指向的位置 -
符号链接:/var/www/myapp/current → 指向某个具体 release 目录(如
releases/20260820-1422) -
版本目录:每个发布生成独立目录,带时间戳或版本号,例如:
/var/www/myapp/releases/20260820-1422、/var/www/myapp/releases/20260821-0915
Apache 配置写法:只认 current,不写死版本
在虚拟主机配置中,DocumentRoot 和对应 Directory 块都使用 current 路径:
通过全交互式问答对话,逐章节完成长文档的创建、编写和审计。适用于白皮书、方案书、用户手册、分析报告等需要深度共创的文档。 当用户提到"交互式写文档"、"一起写白皮书"、"逐章讨论"、"Step by Step写文档"、"帮我写方案书/报告/手册", 或者用户想通过问答方式完成任何长文档编写时,使用此技能。即使用户...
DocumentRoot "/var/www/myapp/current"
<Directory "/var/www/myapp/current">
Require all granted
Options -Indexes +FollowSymLinks
AllowOverride None <!-- 禁用 .htaccess,提升性能与确定性 -->
</Directory>注意:AllowOverride None 是关键,避免运行时解析 .htaccess 带来的不确定性,也防止旧版本残留规则干扰新版本。
发布脚本关键步骤:原子切换 + 安全校验
每次上线执行以下操作(建议封装为可复用的 shell 脚本):
- 将新代码部署到新 release 目录(如
/var/www/myapp/releases/20260821-0915) - 运行初始化命令(
composer install、npm run build等) - 检查健康端点(如
curl -f http://localhost/index.php或自定义/health) - 用
ln -sf releases/20260821-0915 current原子替换软链接 - 可选:清理过期 release(保留最近 2–3 个,便于秒级回滚)
权限与缓存配合要点
仅靠符号链接还不够,需同步处理两个细节:
-
文件权限一致:所有 release 目录属主/属组相同(如
www-data:www-data),且current链接本身有读取权限 -
OPcache 清理(PHP 场景):若用 PHP,切换后调用
opcache_reset()或触发systemctl reload php*-fpm,避免旧字节码残留

















