supervisor+go+beanstalkd环境配置和部署

1. 背景

本次部署包含要素:

  • golang 可执行文件,叫 task_center
  • beanstalkd
  • supervisor
  • centos服务器

目的:把golang程序部署到centos服务器,golang程序里面包含beanstalkd后台服务需要启动,用supervisor来控制golang程序和beanstalkd后台服务在开机时可以自动启动

1.1 官网

Supervisor 官网

1.2 介绍

Supervisor 是一个进程控制系统。
它是一个 C/S 系统 (注意:其提供 WEB 接口给用户查询和控制)。
它允许用户去监控和控制在类 UNIX 系统的进程。
它的目标与 launchd、daemontools 和 runit 有些相似。
但是与它们不一样的是、它不是作为 init (进程号 pid 是 1) 运行。
它是被用来控制进程、并且它在启动的时候和一般程序并无二致。
那么通俗点,它的作用是什么?
你的 Nginx,Tomcat,memcache,Redis… 会崩么?
那你自己写的服务器监测脚本呢?
好吧、不要再纠结了、交给 Supervisor 吧!
它会帮你维护这些、即使它们不小心崩了、Supervisor 会帮你看住它们、维护它们。

2. 操作

2.1 supervisor安装和配置

安装supervisor

1
yum install -y supervisor

启动supervisor

1
systemctl start supervisord

查看supervisor服务状态

1
systemctl status supervisord
1
2
3
4
5
[root@server06 centos]# systemctl status supervisord
● supervisord.service - Process Monitoring and Control Daemon
Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 二 2022-04-26 15:30:24 CST; 2 weeks 3 days ago
Main PID: 4643 (code=exited, status=0/SUCCESS)

查看配置文件最底层,新增自己的进程监听配置文件目录

1
vim /etc/supervisord.conf

进入supervisord.d文件,新建自己的配置

1
2
cd /etc/supervisord.d/
vim task_center.ini
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
#项目名
[program:task_center]
#脚本目录
directory=/home/centos/task_center
#脚本执行命令
command=/home/centos/task_center/task_center

#脚本运行的用户身份
user = root
#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,
#有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,
#如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的时候
autorestart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1
#当进程启动失败后,最大尝试启动的次数,默认为3
startretries=3
#这个是当我们向子进程发送stopsignal信号后,到系统返回信息给supervisord所等待的最大时间
#默认为10
stopwaitsecs=10

#把stderr重定向到stdout,默认 false
redirect_stderr = true
#日志输出
stdout_logfile=/home/centos/task_center/log/comm.logs
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 50M
#stdout日志文件备份数
stdout_logfile_backups = 10
stderr_logfile=/home/centos/task_center/log/err.log
#stderr日志文件大小,默认 50MB
stderr_logfile_maxbytes = 50M
#stderr日志文件备份数
stderr_logfile_backups = 10

把golang执行文件 task_center 放在/home/centos/task_center目录下

1
2
3
4
5
6
7
8
[centos@server06 task_center]$ pwd
/home/centos/task_center
[centos@server06 task_center]$ ll
总用量 18952
drwxrwxr-x 2 centos centos 4096 512 17:54 conf
drwxrwxr-x 2 centos centos 4096 512 22:28 log
-rwxrwxr-x 1 centos centos 19391610 512 17:41 task_center
drwxrwxr-x 2 centos centos 4096 512 17:31 temp

然后执行supervisorctl update更新supervisor配置

supervisor常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#supervisord 安装完成后有两个可用的命令行 supervisord 和 supervisorctl,命令使用解释如下:

supervisord #初始启动 Supervisord,启动、管理配置中设置的进程。
#停止某一个进程(programxxx),programxxx 为 [program:beepkg] 里配置的值,这个示例就是 beepkg。
supervisorctl status #查看程序运行状态
supervisorctl stop programxxx #停止指定应用
supervisorctl stop all #停止所有应用
supervisorctl start programxxx #启动某个进程
supervisorctl start all #启动所有应用
supervisorctl restart programxxx #重启某个进程
supervisorctl restart all #重启所有应用
supervisorctl stop groupworker #重启所有属于名为 groupworker 这个分组的进程(start,restart 同理)
supervisorctl stop all #停止全部进程,注:start、restart、stop 都不会载入最新的配置文件。
supervisorctl reload #载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl update #根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

sudo supervisorctl update #修改服务配置文件后执行命令
supervisorctl tail test stdout #错误信息查看

# 注意:显示用 stop 停止掉的进程,用 reload 或者 update 都不会自动重启。

update 更新新的配置到supervisord(不会重启原来已运行的程序)

reload,载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)

2.2 beanstalkd安装和开启

安装beanstalkd

1
yum -y install beanstalkd --enablerepo=epel

查看版本

1
beanstalkd -v

因为我的项目中要开启11300和11301端口,并且我打算让服务器启动后自动启动这个两个端口的服务,所以可以用supervisor来运行相关的指令来实现这个功能

同上面一样,在目录/etc/supervisord.d/下新建一个文件

1
vim task_centor_port.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[program:task_center_port]

# 同时开启 1130011301 端口服务
command=/bin/bash -c "beanstalkd -l 172.18.92.148 -p 11300 & beanstalkd -l 172.18.92.148 -p 11301 &"
directory=/home/centos/task_center

autostart=true
startsecs=5
startretries=3
autorestart=true
stopwaitsecs=10
user=root

redirect_stderr=true
stdout_logfile=/home/centos/task_center/log/comm_port.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=5
stderr_logfile=/home/centos/task_center/log/err_port.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=5

然后执行supervisorctl update更新supervisor配置

退出服务器后重新打开,用如下命令检查是否开启端口

1
ps -aux | grep beanstalkd

如下结果表示开启成功

1
2
3
4
5
6
7
8
9
10
11
连接主机...
连接主机成功
Last login: Fri May 13 18:35:43 2022 from 183.56.160.125

Welcome to Alibaba Cloud Elastic Compute Service !

[centos@server06 ~]$ ps -aux | grep beanstalkd
centos 12953 0.0 0.0 112720 988 pts/0 S+ 18:35 0:00 grep --color=auto beanstalkd
root 17135 0.0 0.0 8748 664 ? S 512 0:02 beanstalkd -l 172.18.92.148 -p 11300
root 17136 0.0 0.0 8748 660 ? S 512 0:02 beanstalkd -l 172.18.92.148 -p 11301
[centos@server06 ~]$

2.3 修改配置文件发布supervisorctl管理界面

vi /etc/supervisord.conf

[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123    ; (default is no password (open server))

2.4 说明Unix系统进程信号

参考:

  1. https://www.sulvblog.cn
  2. supervisor 安装与使用
  3. supervisor 安装配置使用