当前位置:首页 > 文章列表 > 文章 > php教程 > Envoyer零停机部署实战教程

Envoyer零停机部署实战教程

2026-05-19 16:09:52 0浏览 收藏
Envoyer 的“零停机部署”并非开箱即用的魔法功能,而是依赖符号链接原子切换、独立发布目录与严格配置的共享路径(如 .env 和 storage)三者精密协同的结果;真正实现无缝更新的关键在于:数据库迁移必须在 current 切换前完成且保持向前兼容,共享文件需手动上传并正确映射,而队列和定时任务必须通过 Supervisor 或 Cron 主动重启或指向 current 路径——任何一环疏漏(比如在 After 阶段执行 migrate、遗漏 shared 配置或忽略健康检查盲区),都可能引发静默故障、500 错误或后台任务停滞,让看似成功的部署暗藏线上危机。

Envoyer如何实现零停机_LaravelEnvoyer无缝部署策略【实战】

Envoyer 本身不提供“零停机”的魔法开关,它只是把一套已被验证的原子化发布流程封装成了图形界面。真正起作用的是符号链接切换 + 独立发布目录 + 共享路径隔离 —— 这三者缺一不可。如果你在 Envoyer 面板里勾了“Zero Downtime Deployment”但没配对共享目录或迁移仍在新代码加载后执行,那还是会有请求失败。

为什么 current 软链切换能实现零停机

PHP-FPM 处理每个请求时,会根据 Nginx 的 root /home/forge/example.com/current/public 去加载文件。只要 current 指向的是一个完整、已安装依赖、已运行迁移、已生成缓存的目录,切换动作(ln -nfs releases/20260429123456 current)就是纳秒级的。用户不会感知到任何中断,因为旧进程还在处理完手头请求,新请求立刻落到新代码上。

容易踩的坑:

  • 没把 .envstorage/ 设为共享路径 → 新 release 目录读不到配置或上传文件,直接报错
  • 在 Envoyer 的“After”阶段才跑 php artisan migrate → 此时 current 已切过去,旧代码可能还在执行,而新迁移已改表结构,导致 500
  • 启用了“Run migrations in queue”,但队列进程没配置为优雅重启 → 迁移卡在队列里,或者旧 worker 仍用老代码执行任务

php artisan migrate 必须在 current 切换前完成

Envoyer 默认把迁移放在“Deploy”阶段末尾,也就是新目录准备就绪但尚未激活时。这是安全窗口:代码已就位,数据库还没动,旧服务照常运行。你必须确认这个阶段确实执行了迁移,并且迁移本身是向前兼容的。

关键检查点:

  • 打开项目设置 → “Deployment Scripts” → 找到 “Before” 或 “Deploy” 区块,确认有 php artisan migrate --force 且不在 “After”
  • 如果迁移含破坏性操作(如删字段、改类型),务必拆成两步:先加字段并兼容旧逻辑,上线后再删;Envoyer 不会帮你做语义分析
  • 避免在迁移里写 DB::table(...)->get() 加载大量数据 —— 这会阻塞部署,超时后 Envoyer 可能标记失败并回滚

共享路径(shared)不是可选项,是强制项

Envoyer 在服务器上自动创建 /home/forge/example.com/shared,但不会自动把你的 .envstorage 放进去。你得手动上传并配置路径映射,否则每次部署都会覆盖掉这些运行时必需的数据。

正确做法:

  • 首次部署前,把生产 .env 上传到 /home/forge/example.com/shared/.env
  • 在 Envoyer 设置页 → “Shared Files” 里填入:.env, storage(注意不带斜杠)
  • 确保 storage 目录权限为 775,属主是 forge:www-data,否则新 release 下的 php artisan storage:link 会失败
  • 不要在 “Deployment Script” 里写 cp -r shared/storage ./storage —— Envoyer 会在每次部署时自动软链,重复操作反而可能破坏结构

队列与定时任务不随 current 自动更新

Nginx 请求走的是 PHP-FPM,它每次请求都重新加载 current 下的代码;但 php artisan queue:work 是长进程,启动后就锁死了当时的代码路径。你切了 current,它还跑在上个 release 里。

解决方案只有两个:

  • 在 Envoyer 的 “After” 脚本里加:sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl restart myapp-queue(假设你用 Supervisor 管理)
  • 或者更稳妥地,在 “Before” 阶段就停掉旧队列:sudo supervisorctl stop myapp-queue,再在 “After” 启动新队列
  • 同理,php artisan schedule:run 如果是用 Cron 调用的,需确认 Cron 条目里路径写的是 /home/forge/example.com/current/artisan,而不是固定死的某个 release 目录

最常被忽略的一点:Envoyer 的“健康检查”默认只访问 / 返回 200 就算成功。但它不校验数据库连接、缓存是否生效、队列是否已重启。一次看似成功的部署,可能让后台任务静默失效数小时——直到你发现邮件没发、通知没推、统计漏了数据。

到这里,我们也就讲完了《Envoyer零停机部署实战教程》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

实现一个支持“优先级队列”与“自动垃圾回收”的高阶 Promise 执行器,需要结合 JavaScript 的异步特性、队列管理以及内存管理机制。以下是一个逐步的实现思路:1. 理解需求优先级队列:确保高优先级的任务先执行。自动垃圾回收:当任务完成或超时后,自动清理不再需要的 Promise 或数据。2. 核心结构设计2.1 队列使用一个优先级队列来管理任务,每个任务包含:priority(优先级实现一个支持“优先级队列”与“自动垃圾回收”的高阶 Promise 执行器,需要结合 JavaScript 的异步特性、队列管理以及内存管理机制。以下是一个逐步的实现思路:1. 理解需求优先级队列:确保高优先级的任务先执行。自动垃圾回收:当任务完成或超时后,自动清理不再需要的 Promise 或数据。2. 核心结构设计2.1 队列使用一个优先级队列来管理任务,每个任务包含:priority(优先级
上一篇
实现一个支持“优先级队列”与“自动垃圾回收”的高阶 Promise 执行器,需要结合 JavaScript 的异步特性、队列管理以及内存管理机制。以下是一个逐步的实现思路:1. 理解需求优先级队列:确保高优先级的任务先执行。自动垃圾回收:当任务完成或超时后,自动清理不再需要的 Promise 或数据。2. 核心结构设计2.1 队列使用一个优先级队列来管理任务,每个任务包含:priority(优先级
三伏天怎么算?入伏日期最准方法
下一篇
三伏天怎么算?入伏日期最准方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    2959次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    2733次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    2668次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    2899次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    2849次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码