Linux配置Supervisor 配置遇到的坑

  • linux
  • centos

在linux中web 应用部署到线上后之后发现退出终端后网站就无法访问了

所以需要用Supervisor来守护进程,它可以保证应用一直处于运行状态,在遇到程序异常、报错等情况,导致 web 应用终止时,需要保证程序可以立刻重启,继续提供服务。

在安装配置Supervisor时遇到了挺多坑,我们先看一下安装流程

$ # 安装Supervisor
$ yum install python-setuptools 
$ easy_install supervisor
$ # 自定义配置Supervisor
$ mkdir /etc/supervisor
$ echo_supervisord_conf > /etc/supervisor/supervisord.conf

1,然后打开/etc/supervisor/supervisord.conf ,注意我这里打开的是/etc/supervisor/supervisord.conf而不是/etc/supervisord.conf,我上面自定义配置Supervisor两句命令其实就是在新建的supervisor文件夹下面复制的/etc/supervisord.conf文件,我这里在配置的时候由于看了别人的博客,linux命令不熟悉,所以之前没看懂自定义配置那两句命令的意思,所以索性按照这样做了,不过配置完成后个人感觉没必要自己新建一个文件夹然后复制一份配置,完全可以直接打开/etc/supervisord.conf进行配置就够了

2,打开配置文件后你会看到[include] files = supervisord.d/*.ini(后缀或者.conf) 意思就是关联对应的配置文件下面后缀为.ini的所有配置文件,如果你是直接编辑的/etc/supervisord.conf文件,那就找到/ect/supervisord.d文件在里面建一个后缀.ini的配置文件,然后进行配置,如果你也和我一样加了上面自定义配置那两句话,那就在对应的/etc/supervisor/文件下新建一个supervisord.d(这文件名是自定义的,只要与[include]节点后面的文件名匹配就好了)文件夹并在这个新建的文件夹下面新建配置就好了

3,在建好的文件夹下面新建好配置文件后配置如下代码

复制代码

[program:项目名称]command=dotnet 项目名称.dll 
directory=/root/www/hacker/publish
autorestart=true
stderr_logfile=/var/log/日志.err.logstdout_logfile=/var/log/日志.out.log environment=ASPNETCORE_ENVIRONMENT=Production 
user=root
stopsignal=INTautorestart=true
startsecs=1

复制代码

4,运行 

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

5,查看supervisord是否运行,下面显示运行成功

ps aux | grep supervisord

6,supervisord.conf配置文件说明

复制代码

[unix_http_server]file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid

;[inet_http_server]         ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user              ;登录管理后台的用户名
;password=123               ;登录管理后台的密码[supervisord]logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.loglogfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024minprocs=200                 ;可以打开的进程数的最小值,默认 200[supervisorctl]serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称[program:xx]command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件[include]files = relative/directory/*.ini    ;可以指定一个或多个以.ini结束的配置文件

复制代码

 7,supervisorctl 操作

supervisorctl 是 supervisord 的命令行客户端工具,使用的配置和 supervisord 一样,这里就不再说了。下面,主要介绍 supervisorctl 操作的常用命令:

输入命令 supervisorctl 进入 supervisorctl 的 shell 交互界面,就可以在下面输入命令了。:

  • help # 查看帮助

  • status # 查看程序状态

  • stop program_name # 关闭 指定的程序

  • start program_name # 启动 指定的程序

  • restart program_name # 重启 指定的程序

  • tail -f program_name # 查看 该程序的日志

  • update # 重启配置文件修改过的程序(修改了配置,通过这个命令加载新的配置)

也可以直接通过 shell 命令操作:

  • supervisorctl status

  • supervisorctl update

8,遇到问题

问题一:unix:///var/run/supervisor/supervisor.sock no such file

解决方案

sudo chmod 777 /run

sudo chmod 777 /var/log

问题二:Unlinking stale socket /var/run/supervisor/supervisor.sock

解决方案

unlink /var/run/supervisor/supervisor.sock

问题三:Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

ps aux  grep supervisord
kill - 9 进程ID

如果还有其他问题可以到你配置的日志目录下面去查看日志