9.3 交付上线:部署与运维


9.3 交付上线:部署与运维

本节摘要:交付是全册的终点:一条标准的零停机部署流水线(拉代码、装依赖、跑迁移、清缓存、平滑重启队列、健康检查),加上生产环境的配置纪律;上线之后靠日志分级、监控告警、备份与恢复演练这套物业班子守着。本节给出可直接照抄的部署脚本骨架与上线检查单,读完你能把工地正式交付,并且交得放心。

上线不是复制粘贴

把代码拷到服务器就完事的"部署",问题会在第三天集中爆发:.env 里有调试残留、队列进程还驻着旧代码、迁移跑了但缓存没清、数据库从没备份过。本节按"部署时一次做对、上线后长期守住"两段展开。工头 mindset 换一下:从这一节起你管的不只是代码,还有这个项目的生产生命。

生产环境配置纪律

先立底线,再谈流程。以下配置是生产服务器的硬性要求:

# .env 生产侧关键项 APP_ENV=production APP_DEBUG=false # 调试面板绝不能在生产开着:报错页会泄漏环境变量与源码路径 LOG_CHANNEL=daily # 日志按天切分,避免单文件膨胀 LOG_LEVEL=warning # 生产以 warning 起步,排障时临时调级 QUEUE_CONNECTION=redis # 第八章的选型落到生产 CACHE_STORE=redis SESSION_DRIVER=redis # 多机部署三件套必须共享存储

服务器侧三件事:Web 服务指向 public 目录(唯一的对外大门,呼应第二章);storage 与 bootstrap/cache 目录对 PHP 进程可写;PHP-FPM 与 OPcache 按上一节调优。

一条零停机部署流水线

零停机的思路是"新代码就位的过程中,旧进程继续服务"。以下是一个可照抄的骨架(以 git 拉取加脚本为例,CI 工具化后逻辑相同):

#!/usr/bin/env bash set -e # 任何一步失败立即中止 cd /var/www/workorder git pull origin main # 1. 拉新代码 composer install --no-dev --optimize-autoloader # 2. 装生产依赖 php artisan migrate --force # 3. 跑迁移(force 免交互确认) npm ci && npm run build # 4. 前端资产构建 php artisan config:cache && php artisan route:cache && php artisan event:cache # 5. 框架缓存三连(第九章第二梯队) php artisan queue:restart # 6. 平滑重启队列 worker(旧进程跑完手头单子再退) sudo systemctl reload php8.3-fpm # 7. 重载 PHP 进程(OPcache 更新) curl -fsS https://workorder.example/up # 8. 健康检查(Laravel 11 内置 /up 路由)

这个顺序每一环都有讲究:迁移在资产构建前(新旧代码共存窗口里,数据库结构必须先兼容旧代码——所以迁移要"只加不删、分步上线",这是第五章纪律在生产侧的回报);queue:restart 必须在代码更新后(否则 worker 驻着旧逻辑,第八章的坑在这里收口);健康检查放最后,绿灯才算部署成功。高级做法如符号链接切换发布目录、蓝绿双环境,本质都是这套顺序的工程化封装,官方的 Forge 与 Envoyer 类工具就是把流水线产品化,自建脚本到瓶颈再考虑不迟。

图 9-3:零停机部署的接力顺序

图 9-3:零停机部署的接力顺序

上线之后的物业班子

日志:单条请求的一切异常都进 storage 日志,按天切分;关键业务动作(改价、删单)单独打业务日志带上下文编号,排障时按单号串起完整链路。监控:外部拨测盯可用性(健康检查路由就是给监控探针用的),进程内用 Telescope 这类工具看请求与任务明细(仅限内网开,生产对外要关),错误聚合用 Sentry 类服务,报错自动带堆栈与现场。告警:队列积压超阈值(queue:monitor 配合调度器每分钟检查)、磁盘超八成、错误率突增——三条红线各接一个通知渠道,接的是第八章的通知系统。

备份与恢复:数据库每日全量加 binlog 增量,备份异地存放;更重要的是恢复演练——每季度从备份真恢复一次到隔离环境并验证数据,没演练过的备份等于没有备份。社区成熟的 backup 包把数据库、目录、清理、加密串成一条命令,配置好挂进调度器即可。

上线检查单与回滚预案

部署脚本是"每次都做"的部分,上线检查单是"第一次上线"要逐项打勾的部分,两者互补:

  • 域名与证书就位,HTTP 强制跳 HTTPS(第七章的令牌与 Cookie 安全都以 HTTPS 为前提);
  • .env 生产侧逐项核对:APP_DEBUG 为 false、密钥已生成、数据库与 Redis 凭据正确;
  • storage 与 bootstrap/cache 可写,public 为唯一 Web 根;
  • 迁移在低峰期执行过一次彩排(用生产备份的副本库演练,而不是直接上生产);
  • supervisor 已托管 queue:work 并开机自启,调度器那条 crontab 已挂;
  • 健康检查地址已接入拨测监控,部署脚本最后一环能真实反映存活。

回滚预案与之配对:代码回滚到上一发布版本(git revert 或重新部署上一标签);迁移按"只加不删"纪律,回滚代码通常无需回滚库;静态资产与配置缓存重新生成;队列平滑重启。整个预案写成文档放进仓库,每一次上线彩排都走一遍——事故现场不给你查文档的时间。

三个高频追问

共享虚拟主机能跑 Laravel 项目吗?
能跑但不建议:无法托管队列进程、调度器受限、PHP 版本与扩展受制于人。同样的预算,一台入门云主机的可控性高得多。真要用,至少确认支持 SSH、可控 PHP 版本与 cron。

多台服务器怎么保证配置一致?
配置进部署流水线统一下发,服务器本身"养牛不如养鸡"——每台都是同一脚本克隆出来的,人工在单机上打的补丁都是未来的事故源。这就是基础设施即代码思想的朴素版本。

时区问题出在哪一层?
数据库与 PHP 各有默认时区,混用就会时间漂移。统一方案:存储一律 UTC(config 里 app.timezone 设为 UTC),展示层按用户时区换算。调度器的 dailyAt 之类表达式跑在应用时区上,跨国部署时尤其要写明。

本节要点回顾

  • 配置底线:debug 关、日志切分降级、session 与队列与缓存三件套共享 Redis。
  • 部署八步:拉码、装依赖、迁移、建资产、缓存三连、重启队列、重载 PHP、健康检查,顺序即兼容性。
  • 迁移纪律的生产侧回报:只加不删分步上线,新旧代码共存窗口才安全。
  • 物业三件套:日志分级、监控告警接通知系统、备份必须配恢复演练。

到这里,"接一个需求:路由进件、控制器派工、模型施工、验收上线"的一条龙完整跑通。全册的地图、流水线与检查单都在你手上了——下一项工程,开工。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U