目錄
1.前言
2.環境和軟件的准備
3.創建.NET Core API項目
4.VMware Workstation虛擬機及Centos 7安裝
5.Centos 7安裝.NET Core環境
6.發布.NET Core項目到Linux
7.啟動和停止.NET Core項目
8.為.NET Core項目創建Supervisor進程守護監控
9.防火牆配置,允許外網或局域網訪問.NET Core站點
10.總結
1.Supervisor介紹
在linux或者unix操作系統中,守護進程(Daemon)是一種運行在后台的特殊進程,它獨立於控制終端並且周期性的執行某種任務或等待處理某些發生的事件。由於在linux中,每個系統與用戶進行交流的界面稱為終端,每一個從此終端開始運行的進程都會依附於這個終端,這個終端被稱為這些進程的控制終端,當控制終端被關閉的時候,相應的進程都會自動關閉。但是守護進程卻能突破這種限制,它脫離於終端並且在后台運行,並且它脫離終端的目的是為了避免進程在運行的過程中的信息在任何終端中顯示並且進程也不會被任何終端所產生的終端信息所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。
此處的創建守護進程,是指發布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主進程創建一個守護進程。在 Linux 上有很多可以管理進程的工具,我們使用 Supervisor 來做這個事情。
原因有兩點:
①、它是微軟官方文檔推薦的,降低學習成本。
②、它並不一定是最好的,但一定是文檔最全的。
2.在Linux上安裝Supervisor
#執行epel-release sudo yum -y install epel-release #安裝Supervisor sudo yum -y install supervisor #通過配置文件來啟動supervisor sudo supervisord -c /etc/supervisord.conf #啟動supervisorctl sudo supervisorctl -c /etc/supervisord.conf #查看supervisor 版本 version
這里直接執行安裝Supervisor,可能會出現沒有可用軟件包 supervisor,這個時候需要安裝一個叫”epel-release”的軟件包,這個軟件包會自動配置yum的軟件倉庫
注意:需要執行supervisorctl,如果出現error: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib64/python2.7/socket.py line: 224的錯誤,需要先執行下面語句:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf
然后在去執行需要的操作,如下圖:
3.創建.NET Core項目的Supervisor配置文件
#進入supervisord.d目錄 cd /etc/supervisord.d #新建NetCore進程配置文件 sudo touch DemoNetCore.ini #查看和編輯DemoNetCore.ini配置文件 sudo vim DemoNetCore.ini #進入文件后,按“i”或者“a”進入插入模式,插入下面的配置信息
#配置程序名稱 [program:DemoNetCore] #運行程序的命令 command=dotnet Demo.Net.Core.dll --urls="http://*:8081;http://*:8082" #命令執行的目錄 directory=/var/www #進程環境變量 environment=ASPNETCORE_ENVIRONMENT=Production #進程執行的用戶身份 user=demo #進程停止信號,可以為TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號默認為TERM 。當用設定的信號去干掉進程,退出碼會被認為是expected,非必須設置 stopsignal=INT #如果是true的話,子進程將在supervisord啟動后被自動啟動,默認就是true,非必須設置 autostart=true #這個是設置子進程掛掉后自動重啟的情況,有三個選項,false,unexpected和true。如果為false的時候,無論什么情況下,都不會被重新啟動,如果為unexpected,只有當進程的退出碼不在下面的exitcodes里面定義的退出碼的時候,才會被自動重啟。當為true的時候,只要子進程掛掉,將會被無條件的重啟 autorestart=true #這個選項是子進程啟動多少秒之后,此時狀態如果是running,則我們認為啟動成功了,默認值為1 。非必須設置 startsecs=1 #錯誤日志文件 stderr_logfile=/var/log/DemoNetCore.err.log #輸出日志文件 stdout_logfile=/var/log/DemoNetCore.out.log
#按ESC,輸入命令保存配置文件 :wq (保存編輯操作退出) :wq! (保存編輯強制退出) :w ! sudo tee %
注意:如果之前進入編輯文件沒有在root或者sudo下,使用wq,將會提示只讀,使用強制執行,使用wq!,將會提示E212:無法打開或寫入文件,這個時候需要用到w ! sudo tee %這個命令,然后在q退出編輯
重新加載Supervisor配置,查看Supervisor運行的進程
#通過配置文件來啟動supervisor sudo supervisord -c /etc/supervisord.conf #啟動supervisorctl sudo supervisorctl -c /etc/supervisord.conf #重新加載配置文件 reload #查看運行的狀態 status
下面我們來測試下站點是否運行正常
#查看相關進行 ps -aux | grep "Demo.Net.Core.dll" #訪問啟動的站點 curl http://localhost:8081/weatherforecast
如下圖,Supervisor已經開啟了Dotnet的進程,訪問接口地址,返回數據成功
注意:這里有個問題就是,當Linux系統關機后,Supervisor可能不會自己開啟,導致需要手動執行sudo supervisord -c /etc/supervisord.conf 命令之后,Dotnet進程才會自動啟動,這樣與我們需要達到的效果相差甚遠,解決方法看下面第三步。
4.配置Supervisor開機自啟動
#進入system目錄 cd /usr/lib/systemd/system #編輯supervisord.service文件 sudo vim supervisord.service
supervisord.service文件內容如下
[Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42 [Install] WantedBy=multi-user.target
編輯好后保存退出,然后執行命令,查看是否啟動成功
#啟動服務 systemctl enable supervisord #驗證一下是否為開機啟動 systemctl is-enabled supervisord
5.驗證進程守護監控效果
直接干掉Dotnet進程,看看會不會自動啟動
#查看dotnet進程 ps -aux|grep dotnet #強制殺死dotnet進程 kill -9 %PID #再次查看dotnet進程 ps -aux|grep dotnet
重啟Linux,然后直接訪問站點
6.Supervisor常用命令
# 啟動所有
supervisorctl start all
# 重啟所有
supervisorctl restart all
# 停止所有
supervisorctl stop all
#PS:要操作某個服務,把all換成服務名即可
#查看服務狀態
supervisorctl status