在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.log stdout_logfile=/var/log/日志.out.log environment=ASPNETCORE_ENVIRONMENT=Production user=root stopsignal=INT autorestart=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.log logfile_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 ;可以打開的文件描述符的最小值,默認 1024 minprocs=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 ; 啟動失敗自動重試次數,默認是3 user=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
如果還有其他問題可以到你配置的日志目錄下面去查看日志