Supervisor 的使用和集群下的管理

项目中经常会有些需要常驻后台的服务,它的存活问题也成为了一个重点。在 php laravel 和 go 的 beego 中同时提到了 Supervisor。 项目中也刚好有使用(运维包干了),本着自己也会好沟通的原则进行了下面的尝试

Supervisor 是什么

Supervisor是一个客户端/服务器系统,允许其用户在类UNIX操作系统上控制多个进程。

我的理解就是它是一个可以提供web管理页面的守护进程工具

安装

CentOS

1
2
3
4
//安装
yum install supervisor
//生成配置文件
echo_supervisord_conf > /etc/supervisord.conf

安装成功后会有2个程序 supervisordsupervisorctl

supervisor d 负责监听进程
supervisor ctl 负责管理supervisord监听的进程,并且监听supervisord

测试运行

在 /etc/supervisord.conf 添加

1
2
[program:foo]
command=/bin/cat

如果只杀死主进程,子进程就可能变成孤儿进程。通过这两项配置来确保所有子进程都能正确停止

1
2
stopasgroup=true             ; send stop signal to the UNIX process group
killasgroup=true ; SIGKILL the UNIX process group

运行

1
2
// -n 前台运行
supervisord -c /etc/supervisord.conf -n

测试图

可以看见我们Supervisor成功启动,并且拉起和监听了一个 PID 26540 的 cat进程

supervisorctl 使用

supervisorctl 需要使用 supervisord 一样的配置文件。在配置文件中我们可以添加一些分组信息来更好的区分和使用

1
2
3
[group:test]
programs=foo ; each refers to 'x' in [program:x] definitions
priority=999 ; the relative start priority (default 999)

下面我们运行 supervisorctl

1
supervisorctl -c /etc/supervisord.conf

会看见如下输出

可以看见我们 test 分组下的foo正常工作,并且进入交互模式。我们输入 help可以看见它支持的一些命令

1
2
3
4
default commands (type help <topic>):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

在退出交互模式的情况下 正常 supervisorctl + commands 可当作shell使用,比如这个场景

我们发布Nginx反向代理下的go代码

  1. git push 到远程仓库
  2. rdc打包同步到服务器
  3. 服务器上使用 supervisorctl restart name 来重启这个进程完成代码的部署发布

安装web管理界面(集群管理)

这里我们使用官方推荐的 PHP monitor

  1. 创建目录下载项目源码
1
2
make monitor
git clone git@github.com:mlazarov/supervisord-monitor.git

2.修改 supervisord.conf http serve配置

1
2
3
4
[inet_http_server]         ; inet (TCP) server disabled by default
port=*:5555 ; (ip_address:port specifier, *:port for all iface)
username=zjj ; (default is no username (open server))
password=zjj ; (default is no password (open server))
  1. 修改PHP配置文件
1
2
3
4
cd ~/monitor/supervisord-monitor/application/config

cp supervisor.php.example supervisor.php

1
2
3
4
5
6
7
8
$config['supervisor_servers'] = array(
'测试' => array(
'url' => 'http://116.196.88.52:5555/RPC2',
'port' => '5555',
'username' => 'zjj',
'password' => 'zjj'
),
);
  1. 配置Nginx vost
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {

listen 5566;

index index.html index.htm index.php;
root /opt/www/monitor/supervisord-monitor/public_html;

location / {
try_files $uri $uri/
/index.php$is_args$query_string;
}

location /nginx_status
{
stub_status on;
access_log off;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}


location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
  1. 重启 supervisord 和 Nginx 让配置生效

ps:

  1. 集群管理才需要用到 monitor,非集群可以打开自带的 inet_http_server 模块功能够用
  2. monitor 没有权限验证可以再 Nginx 上加上 401保证安全

产考文档

https://www.rddoc.com/doc/Supervisor/3.3.1/zh/
http://supervisord.org/running.html

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~