之前在Asp.Net Core 3.1 發佈至Linux中已經成功的在CentOS8中運行了Asp.Net Core站點。但是,該站點是手動啓動服務,因此有必要對ASP.NET Core網站應用進行監控,使網站可以持續運行,不然退出Shell後網站就停止了。官方推薦使用Supervisor進行監控。很多文章都已經寫了如何安裝Supervisor和配置Supervisor的文章,但參考之後卻沒那麼順利。因此,將自己的安裝和配置過程記錄下來被查。
主要環境
- CentOS Linux release 8.1.1911 (x64)
- Python 3.6.8
- supervisor-4.1.0
安裝Supervisor
多數文章裏,安裝Supervisor要麼這樣安裝:
  yum install supervisor
要麼這樣安裝
yum install python-setuptools
easy_install supervisor
但是,對於我的環境而言,卻沒有成功。經查,“python版本要求2.4以上, 且不能是python3, supervisor不能運行在任何python3版本上。”幸運的是,在我安裝的時候,supervisor已經支持python3了。但需要使用pip安裝。
1.安裝supervisor
[dotnba@CentOS8 ~]$ sudo pip3 install supervisor
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting supervisor
Downloading https://files.pythonhosted.org/packages/ca/1f/07713b0e1e34c312450878801d496bce8b9eff5ea9e70d41ff4e299b2df5/supervisor-4.1.0-py2.py3-none-any.whl (318kB)
100% |████████████████████████████████| 327kB 2.4MB/s
Installing collected packages: supervisor
Successfully installed supervisor-4.1.0
supervisor安裝完成後,會在/usr/local/bin下生成三個執行程序:supervisortd、supervisorctl、echo_supervisord_conf,分別是supervisor的守護進程服務(用於接收進程管理命令)、客戶端(用於和守護進程通信,發送管理進程的指令)、生成初始配置文件程序。
[dotnba@CentOS8 ~]$ cd /usr/local/bin
[dotnba@CentOS8 bin]$ dir
echo_supervisord_conf pidproxy supervisorctl supervisord
2.生成配置文件
在當前用戶的主目錄下生成配置文件:
[dotnba@CentOS8 bin]$ cd /home/dotnba
[dotnba@CentOS8 ~]$ mkdir supervisor
[dotnba@CentOS8 ~]$ cd supervisor
[dotnba@CentOS8 supervisor]$ echo_supervisord_conf > supervisord.conf
[dotnba@CentOS8 supervisor]$ ls
supervisord.conf
3.修改配置文件
創建自定義配置文件夾:
[dotnba@CentOS8 supervisor]$ pwd
/home/dotnba/supervisor
[dotnba@CentOS8 supervisor]$ mkdir conf.d
修改配置文件
[dotnba@CentOS8 supervisor]$ vim supervisord.conf
將配置文件最後修改爲:
[include]
;files = relative/directory/*.ini
;自定義配置文件放置位置
files = conf.d/*.conf
4.啓動supervisor服務
[dotnba@CentOS8 supervisor]$ pwd
/home/dotnba/supervisor
[dotnba@CentOS8 supervisor]$ supervisord -c supervisord.conf
爲Asp.Net Core站點配置守護程序
1. 爲爲Asp.Net Core站點創建配置文件
[dotnba@CentOS8 conf.d]$ pwd
/home/dotnba/supervisor/conf.d
[dotnba@CentOS8 conf.d]$ cat>>WebApiDemo.conf
文件內容如下:
[program:WebApiDemo]
command=dotnet WebApiDemo.dll ; 運行程序的命令
directory=/home/dotnba/dotnet/ ; 命令執行的目錄
environment=ASPNETCORE_ENVIRONMENT=Production ; 進程環境變量
user=dotnba ; 進程執行的用戶身份
stopsignal=INT
autostart=true
autorestart=true ; 程序意外退出是否自動重啓
startsecs=3 ;/自動重啓間隔
stderr_logfile=/var/log/supervisor/WebApiDemo.err.log ; 錯誤日誌文件
stdout_logfile=/var/log/supervisor/WebApiDemo.out.log ; 輸出日誌文件
2. 重新加載配置文件
[dotnba@CentOS8 conf.d]$ supervisorctl reload
3. 日誌權限問題
通常,大多數文章到此爲止。但當我們查看supervisor狀態時,卻可能並不正常。
[dotnba@CentOS8 conf.d]$ supervisorctl status
'INFO spawnerr: unknown error making dispatchers for 'WebApiDemo': EACCES'
解決辦法,首先是要確保supervisor文件夾和WebApiDemo.err.log及WebApiDemo.out.log文件存在,併爲它們授予權限。
[dotnba@CentOS8 conf.d]$ sudo mkdir /var/log/supervisor
[dotnba@CentOS8 conf.d]$ cat>> /var/log/supervisor/WebApiDemo.err.log
[dotnba@CentOS8 conf.d]$ cat>> /var/log/supervisor/WebApiDemo.out.log
[dotnba@CentOS8 conf.d]$ sudo chmod 777 /var/log/supervisor/WebApiDemo.err.log
[dotnba@CentOS8 conf.d]$ sudo chmod 777 /var/log/supervisor/WebApiDemo.out.log
4. 重啓,查看狀態
[dotnba@CentOS8 supervisor]$ supervisorctl -c supervisord.conf restart all
[dotnba@CentOS8 supervisor]$ supervisorctl status
WebApiDemo RUNNING pid 5254, uptime 0:00:19
[dotnba@CentOS8 supervisor]$ ps -ef | grep WebApiDemo
dotnba 5254 3463 0 17:21 ? 00:00:00 dotnet WebApiDemo.dll
dotnba 5426 3421 0 17:25 pts/0 00:00:00 grep --color=auto WebApiDemo
開機啓動Supervisor服務
1. 創建supervisor.service文件
進入/lib/systemd/system目錄,並創建supervisor.service文件,該文件內容如下所示。
# 先查看程序的路徑
[dotnba@CentOS8 system]$ whereis supervisord
supervisord: /usr/local/bin/supervisord /usr/local/bin/supervisord.conf
[dotnba@CentOS8 system]$ whereis supervisorctl
supervisorctl: /usr/local/bin/supervisorctl
[dotnba@CentOS8 system]$ cd /lib/systemd/system
[dotnba@CentOS8 system]$sudo vim supervisor.service
配置文件內容如下:
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2. 設置開機啓動
[dotnba@CentOS8 system]$ systemctl enable supervisor.service
Created symlink /etc/systemd/system/multi-user.target.wants/supervisor.service → /usr/lib/systemd/system/supervisor.service.
[dotnba@CentOS8 system]$ systemctl daemon-reload
[dotnba@CentOS8 system]$ service supervisor status
Redirecting to /bin/systemctl status supervisor.service
● supervisor.service - supervisor
Loaded: loaded (/usr/lib/systemd/system/supervisor.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-02-04 18:17:04 CST; 34s ago
Process: 4469 ExecStart=/usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf (code=exited, status=0/SUCCESS)
Main PID: 4472 (supervisord)
Tasks: 16 (limit: 23832)
Memory: 75.7M
CGroup: /system.slice/supervisor.service
├─4472 /usr/bin/python3.6 /usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf
└─4473 dotnet WebApiDemo.dll
2月 04 18:17:03 CentOS8 systemd[1]: Starting supervisor...
2月 04 18:17:04 CentOS8 systemd[1]: Started supervisor.
3.修改文件權限爲766
[dotnba@CentOS8 system]$ sudo chmod 766 supervisor.service
參考文章:
1.Python3支持的Supervisor安裝與配置,監控進程狀態: https://www.jianshu.com/p/ba6327f198ce
2. supervisor 錯誤集合:https://www.cnblogs.com/52forjie/p/10057999.html
3. Supervisor踩過的坑:https://www.cnblogs.com/drek_blog/p/10998034.html