.NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx)

.NET Core部署到linux(CentOS)最全解決方案,常規篇一文,咱們詳細講解了傳統的.NET Core部署到Linux服務器的方法,學到了Linux在虛擬機下的安裝、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的發佈與運行全過程。本文講講解經過使用Supervisor+Nginx的組合來實現.net core的高效部署。html

一、Supervisor

1.一、Supervisor介紹

官網:http://supervisord.org,源碼位置:https://github.com/Supervisor/supervisorlinux

Supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓。ios

它是經過fork/exec的方式把這些被管理的進程看成supervisor的子進程來啓動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去便可。也實現當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,能夠選擇是否本身啓動和報警。supervisor還提供了一個功能,能夠爲supervisord或者每一個子進程,設置一個非root的user,這個user就能夠管理它對應的進程。nginx

1.二、爲何要用Supervisor

在linux或者unix操做系統中,守護進程(Daemon)是一種運行在後臺的特殊進程,它獨立於控制終端而且週期性的執行某種任務或等待處理某些發生的事件。因爲在linux中,每一個系統與用戶進行交流的界面稱爲終端,每個今後終端開始運行的進程都會依附於這個終端,這個終端被稱爲這些進程的控制終端,當控制終端被關閉的時候,相應的進程都會自動關閉。可是守護進程卻能突破這種限制,它脫離於終端而且在後臺運行,而且它脫離終端的目的是爲了不進程在運行的過程當中的信息在任何終端中顯示而且進程也不會被任何終端所產生的終端信息所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。git

此處的建立守護進程,是指發佈在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主進程建立一個守護進程。在 Linux 上有不少能夠管理進程的工具,咱們使用 Supervisor 來作這個事情。github

緣由有兩點:web

①、它是微軟官方文檔推薦的,下降學習成本。
②、它並不必定是最好的,但必定是文檔最全的。shell

1.三、Supervisor4大組件

  • supervisord

主進程,負責管理進程的server,它會根據配置文件建立指定數量的應用程序的子進程,管理子進程的整個生命週期,對crash的進程重啓,對進程變化發送事件通知等。同時內置web server和XML-RPC Interface,輕鬆實現進程管理。。該服務的配置文件在/etc/supervisor/supervisord.conf。windows

  • supervisorctl

客戶端的命令行工具,提供一個相似shell的操做接口,經過它你能夠鏈接到不一樣的supervisord進程上來管理它們各自的子程序,命令經過UNIX socket或者TCP來和服務通信。用戶經過命令行發送消息給supervisord,能夠查看進程狀態,加載配置文件,啓停進程,查看進程標準輸出和錯誤輸出,遠程操做等。服務端也能夠要求客戶端提供身份驗證以後才能進行操做。centos

  • Web Server

superviosr提供了web server功能,可經過web控制進程(須要設置[inethttpserver]配置項)

  • XML-R- #supervisor

一個Linux/Unix系統上的進程監控工具
一個Python開發的通用的進程管理程序
能夠管理和監控Linux上面的進程
能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓
不過同daemontools同樣,它不能監控daemon進程

1.四、安裝Supervisor

相應安裝建議以管理員方式登陸系統,非管理員請以sudo命令安裝。

Linux sudo命令以系統管理者的身份執行指令,也就是說,經由 sudo 所執行的指令就好像是 root 親自執行。

一、安裝EPEL源的命令以下:

sudo yum -y install epel-release

安裝EPEL源

二、執行以下命令安裝supervisor:

sudo yum -y install supervisor

三、設置開機啓動:

systemctl enable supervisord

四、啓動supervisord

systemctl start supervisord

五、查看supervisord狀態

systemctl status supervisord

1.五、Supervisor配置及使用

經過vi命令或者xftp修改配置文件開啓web界面訪問,以下圖所示,分別取消inet_http_server等四個配置的註釋:

vi /etc/supervisord.conf

執行以下命令,從新加載配置文件:

supervisorctl reload

而後在瀏覽器打開http://你的ip:9001,輸入上面咱們設置的用戶名:user1,密碼:123456後,如圖所示:


看到上圖這個界面,就表示supervisor安裝完成了。

切換到/etc/supervisord.d目錄,在此目錄建立名稱爲:core50test.ini的ini文件,內容以下:

#表示程序名稱,用於在supervisor中顯示,無特殊意義。
[program:core50test] 
# 輸入執行命令,這裏表示執行的是dotnet Core50Test.dll
command=/bin/bash -c "dotnet Core50Test.dll"
# 應用程序根目錄 
directory=/root/app_data/core50test/publish
# 是否自動啓動,當 supervisor 加載該配置文件的時候當即啓動它 
autostart=true
# 是否自動重啓, 程序異常退出後自動重啓
autorestart=true
# 該配置文件輸出單個日誌文件的大小,默認50M
logfile_maxbytes=50MB
# 日誌備份個數 
logfile_backups=10
# 記錄日誌級別 
loglevel=info
# 指定標準輸出日誌文件 
stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
# 環境變量
environment=ASPNETCORE_ENVIRONMENT=Production
# 啓動服務的用戶
user=root
# 把stderr重定向到stdout,默認 false
redirect_stderr=true

上述代碼包含了註釋信息,參考精減版配置以下:

[program:core50test]
command=/bin/bash -c "dotnet Core50Test.dll"
directory=/root/app_data/core50test/publish
autostart=true
autorestart=true
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
redirect_stderr=true

注意:stdout_logfile指向的文件夾必定要先建立,不然沒法啓動,上述配置文件中的內容須要根據用戶實際狀況修改,如我當前登陸的用戶是:yonghu,大家是其餘的就作相應的修改便可。

而後執行以下命令來從新加載配置:

supervisorctl reload

命令執行成功後, 刷新瀏覽器,能夠看到以下界面:

supervisor正在運行的應用

當界面顯示running時,則表示咱們咱們剛剛配置的.net core應用運行起來了。

以下圖所示。

咱們能夠方便的經過supervisor提供的web管理界面對咱們的應用進行啓動與中止,查看日誌等操做,很是的方便,絲般潤滑般的爽呀。

Supervisor啓動與中止應用

查看日誌:

1.六、Supervisor經常使用命令

### 查看supervisorctl支持的命令
# supervisorctl help    
default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

### 查看當前運行的進程列表
# supervisorctl status

  • update 更新新的配置到supervisord(不會重啓原來已運行的程序)

  • reload,載入全部配置文件,並按新的配置啓動、管理全部進程(會重啓原來已運行的程序)

  • start xxx: 啓動某個進程

  • restart xxx: 重啓某個進程

  • stop xxx: 中止某一個進程(xxx),xxx爲[program:theprogramname]裏配置的值

  • stop groupworker: 重啓全部屬於名爲groupworker這個分組的進程(start,restart同理)

  • stop all,中止所有進程,注:start、restart、stop都不會載入最新的配置文

  • reread,當一個服務由自動啓動修改成手動啓動時執行一下就ok

最經常使用的幾個命令爲:

#啓動全部
supervisorctl start all

# 重啓全部
supervisorctl restart all

# 中止全部
supervisorctl stop all

#PS:要操做某個服務,把all換成服務名便可
#查看服務狀態
supervisorctl status

二、使用Nginx

在前面文章中,咱們已經能夠很是方便的對web應用進行部署與管理了,但還存在一個問題,咱們的應用程序默認是綁定的5000端口,若是要指定80端口或者配置域名該怎麼處理呢?下面就該nginx登場了。

2.一、Nginx介紹

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特色是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

2.二、Nginx安裝

安裝方式參考:http://nginx.org/en/linux_packages.html#RHEL-CentOS

安裝先決條件:

sudo yum install -y yum-utils

設置yum存儲庫,先建立一下內容的文件:/etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

默認狀況下,使用穩定 nginx 包的存儲庫。若是要使用主線 nginx 包,請運行如下命令:

yum-config-manager --enable nginx-mainline

運行以下命令安裝nginx:

sudo yum install -y nginx

設置開機啓動:

systemctl enable nginx

啓動nginx:

systemctl start nginx

此時,就能夠在瀏覽器經過ip訪問了:http://你的ip,界面以下:

2.三、Nginx部署

nginx安裝完成後,切換到/etc/nginx/conf.d目錄,修改default.conf文件內容,以下所示:

server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://0.0.0.0:5000;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

保存後,執行以下命令,從新加載配置:

nginx -s reload

而後再次訪問http://你的ip,一切正常的話應該能夠看到以下的界面,表示咱們的.NET Core程序已經完美運行在linux系統了。

若是部署後遇到類型下面這樣的錯誤

出現這樣的問題,有可能的是由於SeLinux的限制,執行以下命令以後,再刷新頁面:

setenforce 0

selinux(security enhanced linux)安全加強型linux系統,它是一個linux內核模塊,也是linux的一個安全子系統。

selinux的主要做用就是最大限度地減少系統中服務進程可訪問的資源(最小權限原則)

若是設置後仍是不能解決,能夠查看nginx的日誌了,默認的日誌路徑爲:/var/log/nginx

經過setenforce 0命令,只是臨時實效,重啓後會失效。

能夠經過修改/etc/selinux/config 文件,將SELINUX=enforcing改成SELINUX=disabled,而後重啓,便可永久生效。

經過近兩篇文章的介紹,咱們須要更新應用,只須要將代碼提交到git倉庫,而後在服務器中執行git pull和dotnet publish便可。

若是熟悉shell的話,能夠經過編寫shell命令一鍵執行應用程序的更新,代碼示例:

# !/bin/bash
cd /root/app_data/source/core50test
git pull
dotnet publish -o /root/app_data/core50test/publish
supervisorctl restart core50test

將上述的代碼保存爲sh文件,上傳到服務器,並設置權限。以下圖所示:

代碼提交到git倉庫後,執行以下命令:

./build.sh

執行結果以下圖所示:

更新後從新運行,已經更新。

這兒可能有的小夥伴會遇到一個小小的坑要注意,shell腳本寫得沒有問題,執行會報相似這樣的錯誤

$'\r':command not found

出現這種問題是由於windows下的文件換行用的是\r\n,而linux系統用的是\n,若是在win下的文檔上傳到linux,就有可能出現這樣的問題,只需用vi打開shell腳本文件,而後使用命令:set ff=unix,保存文件便可。

supervisor一個做爲守護線程,用於維護應用程序的生命週期的,nginx則是做爲反向代理使用,配置shell能夠作到高效部署,很是的方便。


一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,你們能夠經過下面的地址瞭解詳情。

RDIFramework.NET官方網站:http://www.rdiframework.net/

RDIFramework.NET官方博客:http://blog.rdiframework.net/

特別說明,框架相關的技術文章請以官方網站爲準,歡迎你們收藏!

RDIFramework.NET框架由海南國思軟件科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用!

歡迎關注RDIFramework.NET框架官方微信公衆號(微信號:guosisoft),及時瞭解最新動態。

使用微信掃描二維碼當即關注

微信號:guosisoft

相關文章
相關標籤/搜索