# PDF Worker 分布式部署清单 ## 架构 ``` ┌─────────────┐ │ Redis │ │ (pdf队列) │ └──────┬──────┘ ┌──────────────────┼──────────────────┐ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ 主服务器 │ │ PDF机器1 │ │ PDF机器2 │ └───────────┘ └───────────┘ └───────────┘ │ │ │ └──────────────────┼──────────────────┘ ▼ ┌─────────────┐ │ MySQL │ └─────────────┘ ``` --- ## 一、PDF 机器需要的软件 - Docker - Docker Compose - Git --- ## 二、部署步骤 ### 2.1 Clone 代码 ```bash mkdir -p /srv/www/math_cms cd /srv/www/math_cms git clone https://git.yunzhixue.cn/yms/math_cms.git . ``` ### 2.2 拷贝 .env 从主服务器拷贝 `.env` 文件到 `/srv/www/math_cms/.env` > .env 中的 `APP_URL=http://app:8000` 保持不变,PDF worker 会调用本机的 app 容器 ### 2.3 启动服务 > `docker-compose.pdf.yml` 已在项目根目录,clone 后直接可用 ```bash cd /srv/www/math_cms docker compose -f docker-compose.pdf.yml up -d ``` --- ## 三、验证 ### 3.1 检查容器状态 ```bash docker compose -f docker-compose.pdf.yml ps ``` 预期输出:5 个容器都是 `Up` 状态 ### 3.2 检查数据库连接 ```bash docker exec pdf_worker_1 php artisan db:show ``` ### 3.3 检查 Redis 连接 ```bash docker exec pdf_worker_1 php artisan tinker --execute="dump(Redis::ping());" ``` ### 3.4 检查队列消费 ```bash # 查看队列长度 docker exec pdf_worker_1 php artisan tinker --execute="echo Redis::llen('queues:pdf');" # 查看 worker 日志 docker compose -f docker-compose.pdf.yml logs -f pdf-worker-1 ``` ### 3.5 端到端测试 在主服务器触发一个 PDF 生成,观察 PDF 机器日志是否有消费记录。 --- ## 四、日常运维 ```bash # 查看状态 docker compose -f docker-compose.pdf.yml ps # 查看日志 docker compose -f docker-compose.pdf.yml logs -f # 重启 docker compose -f docker-compose.pdf.yml restart # 停止 docker compose -f docker-compose.pdf.yml down --timeout 120 ``` --- ## 五、更新代码 ```bash cd /srv/www/math_cms git pull origin main docker compose -f docker-compose.pdf.yml restart ``` --- ## 六、故障排查 ```bash # 查看失败任务 docker exec pdf_worker_1 php artisan queue:failed # 重试失败任务 docker exec pdf_worker_1 php artisan queue:retry all # 查看 Laravel 日志 tail -f storage/logs/laravel.log ```