hyperf3.0项目部署优化

1,037 阅读4分钟

通过 Supervisord 实现守护进程启动和重启 Hyperf 3.0 项目

docker容器中 apk安装 Supervisor

相关文档: coder55.com/article/158…

在Docker容器中安装Supervisor,您可以按照以下步骤进行操作:

  1. 打开终端,并登录到您的Docker容器中。
  2. 运行以下命令来更新包列表和安装Supervisor:
apk update
apk add supervisor
  1. 安装完成后,您可以使用以下命令来检查Supervisor是否已成功安装:
supervisord --version
  1. 安装完以后会生成文件 /etc/supervisord.conf 默认配置文件。
  2. 根据 /etc/supervisord.conf 中最后一行:files = /etc/supervisor.d/*.ini ;

要配置Supervisor,需要在/etc/supervisor.d/中创建一个.ini后缀的配置文件,并在其中定义要管理的进程。以下是一个我写的配置文件:

# 新建一个应用并设置一个名称,这里设置为 hyperf
[program:hyperf]

# 设置命令在指定的目录内执行
directory=/hyperf-skeleton/lgb-hf-online

# 这里为您要管理的项目的启动命令
command=php bin/hyperf.php start

# 以哪个用户来运行该进程
user=root

# supervisor启动时自动启动该应用
autostart=true

# 进程退出后自动重启进程
autorestart=true

# 进程持续运行多久才认为是启动成功
startsecs=1

# 重试次数
startretries=3

# stderr 标准输出日志输出位置
stderr_logfile=/hyperf-skeleton/lgb-hf-online/runtime/stderr.log

# stdout 标准错误日志输出位置
stdout_logfile=/hyperf-skeleton/lgb-hf-online/runtime/stdout.log

其中,[program:hyperf]是进程的名称,command是要运行的命令,directory是命令所在的目录,autostart表示是否自动启动进程,autorestart表示进程是否在退出后自动重启,redirect_stderr表示是否将标准错误重定向到标准输出。

  1. 保存配置文件后,您可以使用以下命令启动Supervisor:
supervisord -c /etc/supervisord.conf
  1. 现在,Supervisor将会管理您在配置文件中定义的进程。您可以使用以下命令来管理这些进程:
supervisorctl status  # 查看进程状态
supervisorctl start hyperf  # 启动进程
supervisorctl stop hyperf  # 停止进程
supervisorctl restart hyperf  # 重启进程

supervisorctl update 重新加载配置文件
supervisorctl reload 重新启动所有程序

这样,就成功在Docker容器中安装了Supervisor,并配置了要管理的进程。

修改配置,重新启动

1.修改hyperf.ini

  1. supervisorctl stop hyperf 停止进程

  2. supervisorctl update 重新加载配置文件

  3. supervisorctl reload 重新启动所有程序

关闭 Supervisor

  1. 检查Supervisor进程的状态,可以运行以下命令:

    supervisorctl status
    

    这将显示Supervisor管理的进程的状态。

  2. 停止所有Supervisor管理的进程,可以运行以下命令:

    supervisorctl stop all
    

    这将停止所有由Supervisor管理的进程。

  3. 检查Supervisor进程的状态,确保所有进程都已停止:

    supervisorctl status
    

    如果所有进程都显示为停止状态,说明Supervisor已成功关闭。

卸载 (docker apk 安装的 Supervisor,如何卸载)

sock位置:file=/run/supervisord.sock ; the path to the socket file

log位置:logfile=/var/log/supervisord.log ; main log file; default $CWD/supervisord.log

pid位置:supervisord.pid

  1. 首先,停止Supervisor服务:supervisorctl stop all

  2. apk del supervisor 卸载Supervisor

  3. 删除Supervisor的配置文件和日志文件,

    rm -rf /run/supervisord.sock
    rm -rf /var/log/supervisord.log
    rm -rf /etc/supervisord.pid
    

无限重启问题

当我使用以下命令:php bin/hyperf.php start > /dev/hyperferror.log 2>&1 & 就会陷入无限重启。

原因:Supervisor会监控该进程的状态,并在进程退出后尝试重新启动它。然而,由于您使用了&符号将进程置于后台运行,Supervisor无法检测到进程的退出状态,因此会不断尝试重新启动。

stdout_logfilestderr_logfile分别指定了标准输出和标准错误的日志文件路径。所以不再需要 > /dev/hyperferror.log 2>&1 &

常见错误

1.Unlinking stale socket /run/supervisord.sock

当您看到Supervisor输出Unlinking stale socket /run/supervisord.sock时,它意味着Supervisor在启动时发现了一个陈旧(stale)的Unix套接字文件,并试图删除它。

该消息通常是由于之前的Supervisor进程异常终止,但Unix套接字文件未正确清理导致的。为了解决这个问题,您可以按照以下步骤进行操作:

  1. 确保没有其他Supervisor进程正在运行。您可以使用以下命令来检查正在运行的Supervisor进程:
ps -ef | grep supervisord
  1. 如果发现其他Supervisor进程正在运行,请停止它们。使用以下命令将其杀死(将<pid>替换为实际的进程ID):
kill -9 <pid>
  1. 删除陈旧的Unix套接字文件。运行以下命令:
rm /run/supervisord.sock
  1. 重新启动Supervisor。运行以下命令:
supervisord -c /etc/supervisord.conf

在重新启动Supervisor时,它会创建一个新的Unix套接字文件。

这样,您应该能够解决Unlinking stale socket的问题并成功启动Supervisor。