Webman配合Ansible部署的核心是绕开热更新与无状态执行冲突,应通过systemd管理服务、本地构建后rsync同步(排除runtime/log等目录)、并确保runtime目录独立存在且权限正确。

Webman 配合 Ansible 部署,核心不是“能不能”,而是“怎么绕开 Webman 自身热更新机制与 Ansible 无状态执行的冲突”。直接用 php webman restart 在远程执行大概率失败——因为进程没在目标上下文里启动,或 systemd 管理器找不到服务单元。
为什么 php webman restart 在 Ansible 里常失效
Ansible 的 shell 或 command 模块默认以非登录、非交互式 shell 执行命令,不加载用户 profile,导致:
• php 命令可能不在 $PATH 中(尤其当 PHP 是通过 asdf 或自编译安装)
• webman 启动脚本依赖的环境变量(如 APP_ENV、WEBMAN_LOG_PATH)未继承
• systemd 服务若由用户级 systemctl --user 管理,Ansible 默认无法访问其 session bus
• restart 命令本身依赖当前目录下存在 webman 可执行文件,而 rsync 后工作目录可能不是部署路径
推荐用 systemd 管理 Webman 进程(而非原生命令)
把 Webman 当作系统服务来管理,才能被 Ansible 稳定控制。需在目标服务器上提前配置好 service 文件:
[Unit] Description=Webman HTTP Server After=network.target [Service] Type=simple User=www-data WorkingDirectory=/var/www/webman ExecStart=/usr/bin/php /var/www/webman/webman start Restart=always RestartSec=3 Environment=APP_ENV=production StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
然后在 Ansible playbook 中统一用 systemd 模块操作:
立即学习“PHP免费学习笔记(深入)”;
- 确保 service 文件已分发:
copy模块写入/etc/systemd/system/webman.service - 重载配置:
systemd模块设置daemon_reload: true - 启动/重启服务:
state: restarted,比手动shell更可靠 - 避免用
enabled: yes直接开机自启——先验证服务能跑通再启用
部署时必须跳过 composer install 的坑
Webman 项目通常含 vendor 目录,但 Ansible 部署中若在目标机运行 composer install,会引入不可控变量:
- 目标机 PHP 版本/扩展缺失 → 安装失败
- 网络不稳定导致 composer 源超时(尤其国内没配镜像源)
- 权限问题:webman 的
runtime和log目录需 www-data 可写,但composer以 root 运行后可能锁死权限
正确做法是:本地构建 + rsync 排除无关目录。GitLab CI 中 build 阶段就执行:
composer install --no-dev --optimize-autoloader --no-scripts rsync -avz --delete \ --exclude='/.git' \ --exclude='/tests' \ --exclude='/docs' \ --exclude='/runtime' \ --exclude='/log' \ ./ user@prod:/var/www/webman/
Ansible 中对应用 synchronize 模块,并显式设置 archive: no 和 rsync_opts 控制排除项。
Webman 的 runtime 目录不能随代码同步
这是最容易被忽略的点:runtime 下有 cache、container、lock 等运行时生成文件,若每次部署都覆盖,会导致:
- 容器实例重建失败(
container目录被清空,webman启动时找不到已注册服务) - 缓存击穿(所有请求穿透到后端,瞬间压垮 DB)
- 多个部署并发时
lock文件冲突,restart卡死
Ansible 中必须确保:
• runtime 目录在目标机上独立存在,且属主为 www-data
• rsync 或 synchronize 时不包含该目录
• 部署后执行 chown -R www-data:www-data /var/www/webman/runtime(仅改权,不重建)



















