最近工作中用到了 workerman,執行環境為 alpine 構建的基礎映象,計劃通過安裝 supervisor 來進行容器啟動後自動執行 workerman 程式並管理
- 安裝 supervisor
apk add --no-cache supervisor
該報錯是 supervisor 伺服器還未開啟
- 配置管理程式
supervisor 預設配置檔案路徑為 /etc/supervisord.conf,為讓避免讓該配置檔案變成大粽子,我們自定義的配置檔案最好是獨立配置出來,檢視 /etc/supervisord.conf 檔案後面可以發現配置會載入同級目錄下 supervisor.d/*.ini 所有 ini 字尾的配置檔案
- 配置自定義檔案
初步配置為以下
日誌檔案我們當然是要配置對映出來了,免得重啟丟失日後排查問題需要是無法排查,pid 檔案如果不配置的話會預設生成在 supervisord.conf同級下,我們當然不希望它去汙染 etc 目錄了。gateway-worker 在容器裡只能起一個程式,要不會造成埠衝突。[supervisord] logfile=/webser/logs/gatewayworker/supervisord.log pidfile=/var/supervisord.pid [program:gateway_worker] command=/usr/bin/php /webser/www/start.php start -d numprocs=1 autostart=true autorestart=true startsecs=3 stdout_logfile=/webser/logs/gatewayworker/supervisord_out.log stderr_logfile=/webser/logs/gatewayworker/supervisord_err.log
從上圖可以看見 supervisor 啟動服務端後,發現 gateway_worker 程式狀態是 fatal。通過日誌排查,報埠占用的問題,說明在多次重啟,為什麼呢?
網上了解到,supervisor 會將配置中程式以後臺的程式執行,配置中就不能再將命令配置在後臺執行了。command=/usr/bin/php /webser/www/start.php start -d
將這條命令的「-d」去掉,看結果
從圖中看出已經正常啟動了,注意這裡修改配置後使用 docker-compose 來重啟,否則會遇到另外一個問題,下面開講。
像上面如果修改了配置檔案,會出現意外情況
可以看到存在重複的程式,到底怎麼回事?
究其原因是 reload 重新載入配置的時候,supervisor 只關掉了配置中的命令主程式,而命令內生成的子程式沒有停掉導致成了孤獨程式(這裡要手動 kill -9 程式號幹掉),如果多次重啟不斷出現孤獨程式那還得了。
其實 supervisor 是支援配置幹掉子程式的,如果配置
stopasgroup=true
killasgroup=true
看這下不存在孤兒程式了,這下放心了。
- 配置 supervisor 在容器啟動後自動開啟服務
在此之前為了讓容器掛起,在 docker-compose 配置檔案一起使用的command: "tail -f"
,現在肯定要成我們的 supervisor 命令了。command: "/usr/bin/supervisord -c /etc/supervisord.conf"
,只可惜結果未能如我所願,容器總是一啟即退出,這到底又是什麼情況?後來換了一種方案,加個啟動指令碼 start.sh, 在容器啟動執行這個指令碼command: "bash /var/start.sh"
,指令碼就是啟動 supervisor 服務,但未能如我所願。
納悶!我印象中見過使用 supervisor 命令配置來掛起容器的,為什麼不行?到底哪裡出了問題?
靜下心來蒐羅一下,才 get 到另一個點,supervisor 服務預設是以後臺程式啟動的, 我們再使用 docker-compose 的時候需要配置為前臺執行才能讓它起到掛起容器的作用。
如何操作?將 supervisor 配置的nodaemon=false
修改為nodaemon=true
,使 supervisor 以前臺的方式執行來維護容器的掛起狀態。 - 最終配置是這樣的
[supervisord] logfile=/webser/logs/gatewayworker/supervisord.log pidfile=/var/supervisord.pid nodaemon=true [program:gateway_worker] command=/usr/bin/php /webser/www/start.php start numprocs=1 autostart=true autorestart=true startsecs=3 stopasgroup=true killasgroup=true stdout_logfile=/webser/logs/gatewayworker/supervisord_out.log stderr_logfile=/webser/logs/gatewayworker/supervisord_err.log
本作品採用《CC 協議》,轉載必須註明作者和本文連結