最近在尝试使用 octane swoole 驱动的 Laravel 项目时出现了一个问题:在更新代码后使用 octane:reload
重新启动 workers
时新代码不生效。
我的项目是通过 deployer 部署的,通过符号链接的形式将项目目录指向新的代码,但 octane:reload
后新代码并没有生效。
之后发现通过符号链接指向新目录、composer
引入新的库、.env
在重启后都不生效,服务运行过程中动态加载的文件支持 reload,在服务执行前就载入的文件代码不支持reload。
之后我们部署代码后通过执行 octane::stop
和 octane::start
启动服务,这样代码是生效的,但这样并非热部署,每次执行上述命令服务都会中断几秒,导致此时进来的请求 502 报错。
对于同一个项目(同一个代码目录)启动两套 octane swoole
服务,通过 nginx 指向新的服务的形式实现 0 downtime
部署。
启动 服务1、服务2 ,首次将 nginx 指向 服务1,在更新代码后通过stop&start
重启服务2,将nginx指向服务2,reload nginx即实现热部署;在下次更新代码后重启服务1,将 nginx 指向 服务1 并 reload。
当然你也可以在服务器上部署两套代码,这样就不需要该脚本了
新增 Artisan 命令行,自定义 octane 启动脚本
修改脚本:
在原有 octane 服务启动脚本基础上修改不同端口对应不用的状态文件,这样就可以启动多个服务了
若我们想启动两套服务,端口分别是 8012、8013
我们的服务使用 supervisorctl 管理:
将 octane:start
换为我们上一步创建的脚本 Octane:StartOctane
nginx_octane_8012.conf
nginx_octane_8013.conf
我们是通过 deployer 脚本部署的代码,如上次部署用的 8012 端口的服务,本次部署用 8013 端口服务,服务重启脚本如下:
这样在 8013 端口重启后,在将 nginx 指向8013 即可实现0停机部署
本次执行命令:
[1]
deployer : https://deployer.org/