[Hyperf]项目使用Supervisor部署

以 ☁Emo 这个Hyperf项目为例。

部署环境为:Ubuntu20.04 Nginx(1.18) PHP(7.4) Swoole(4.8) Hyperf(2.2)

在运行前确保代码没问题,可现在项目根目录运行 php bin/hyperf.php start 确保项目能启动。

因为服务器之前没有运行过Hyperf项目,所以报了Swoole不存在,直接使用pecl安装即可

pecl install swoole

确保项目能运行起来后,开始部署:

首先安装下supervisor

sudo apt-get install supervisor

根据官方的文档操作时发现在第二步就和现在不一致了,我安装后项目路径是在 etc/supervisor 可能是系统不一样的问题;因此出现不一样的问题,就只把官方文档作为参考了;

在查看原来的配置文件,发现会自动加载conf.d目录下的以.conf结尾的配置,所以我们直接在这个目录下新建个文件

# 新建一个应用并设置一个名称,这里设置为 emo
[program:emo]
# 设置命令在指定的目录内执行
directory=项目地址
# 这里为您要管理的项目的启动命令
command=php ./bin/hyperf.php start
# 以哪个用户来运行该进程
user=root
# supervisor 启动时自动该应用
autostart=true
# 进程退出后自动重启进程
autorestart=true
# 进程持续运行多久才认为是启动成功
startsecs=1
# 重试次数
startretries=3
# stderr 日志输出位置
stderr_logfile=项目地址/runtime/stderr.log
# stdout 日志输出位置
stdout_logfile=项目地址/runtime/stdout.log

保存后目录结构为如下:

在执行这个配置前,请记得先去项目目录下运行一次启动项目,因为我们配置里定义的日志文件,确保目录可写!

接下来启动配置:

sudo supervisord -c /etc/supervisor/supervisord.conf

启动后可通过以下命令查看状态:

sudo supervisorctl status

其他操作命令:

# 启动 hyperf 应用
supervisorctl start hyperf
# 重启 hyperf 应用
supervisorctl restart hyperf
# 停止 hyperf 应用
supervisorctl stop hyperf  
# 查看所有被管理项目运行状态
supervisorctl status
# 重新加载配置文件
supervisorctl update
# 重新启动所有程序
supervisorctl reload

Hyperf项目已经启动,可以通过curl调用接口尝试是否可访问;

接下来配置Nginx通过反代理端口的方式暴露端口,如果你还没安装nginx可通过以下命令安装:

sudo apt-get install nginx

如果你已经安装,进入到Nginx的配置下,新建一个配置,配置内容如下:(官方文档

upstream hyperf {
    # Hyperf HTTP Server 的 IP 及 端口
    server 127.0.0.1:9501;
}

server {
    # 监听端口
    listen 80;
    # 绑定的域名,填写您的域名
    server_name emo_server.abigeater.com;

    location / {
        # 将客户端的 Host 和 IP 信息一并转发到对应节点
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 转发Cookie,设置 SameSite
        proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";

        # 执行代理访问真实服务器
        proxy_pass http://hyperf;
    }

    #静态文件路径
    location /static {
        alias /项目路径/resource/music;
    }
}

主要修改的地方是转发的本地端口以及访问域名,因为我将静态资源文件放到Hyperf的项目下,所以我在下面使用了静态路径指向,如果不需要可以注释掉。

最后执行一下sudo nginx -t确定配置文件正确,再重启一下nginx即可生效。

sudo nginx -s reload

则服务端部署完毕。

之后修改了服务端代码重启下supervisor即可:

supervisorctl restart 项目名

自动化部署实例 ---> Github推送代码后利用Actions部署到服务器