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

来源:https://www.cnblogs.com/88223100/archive/2023/04/29/The-most-comprehensive-solution-for-deploying-NET-Core-to-Linux-CentOS-Advanced-Supervisor_Nginx.html
-Advertisement-
Play Games

在.NET Core部署到linux(CentOS)最全解決方案,常規篇一文,我們詳細講解了傳統的.NET Core部署到Linux伺服器的方法,學到了Linux在虛擬機下的安裝、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的發佈與運行全過程。... ...


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

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

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

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

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

此處的創建守護進程,是指發佈在Linux上 asp.net core 程式的dotnet xxx.dll命令的宿主進程創建一個守護進程。在 Linux 上有很多可以管理進程的工具,我們使用 Supervisor 來做這個事情。

原因有兩點:

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

  • supervisord

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

  • supervisorctl

客戶端的命令行工具,提供一個類似shell的操作介面,通過它你可以連接到不同的supervisord進程上來管理它們各自的子程式,命令通過UNIX socket或者TCP來和服務通訊。用戶通過命令行發送消息給supervisord,可以查看進程狀態,載入配置文件,啟停進程,查看進程標準輸出和錯誤輸出,遠程操作等。服務端也可以要求客戶端提供身份驗證之後才能進行操作。

  • Web Server

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

  • XML-R- #supervisor

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

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

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

1、安裝EPEL源的命令如下:

  1. sudo yum -y install epel-release

安裝EPEL源

2、執行如下命令安裝supervisor:

  1. sudo yum -y install supervisor

安裝supervisor

3、設置開機啟動:

  1. systemctl enable supervisord

設置開機啟動

4、啟動supervisord

  1. systemctl start supervisord

5、查看supervisord狀態

  1. systemctl status supervisord

查看supervisord狀態

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

  1. vi /etc/supervisord.conf

image-20210114101415192

執行如下命令,重新載入配置文件:

  1. supervisorctl reload

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

image-20210114101622234

image-20210114101825812

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

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

  1. #表示程式名稱,用於在supervisor中顯示,無特殊意義。
  2. [program:core50test]
  3. # 輸入執行命令,這裡表示執行的是dotnet Core50Test.dll
  4. command=/bin/bash -c "dotnet Core50Test.dll"
  5. # 應用程式根目錄
  6. directory=/root/app_data/core50test/publish
  7. # 是否自動啟動,當 supervisor 載入該配置文件的時候立即啟動它
  8. autostart=true
  9. # 是否自動重啟, 程式異常退出後自動重啟
  10. autorestart=true
  11. # 該配置文件輸出單個日誌文件的大小,預設50M
  12. logfile_maxbytes=50MB
  13. # 日誌備份個數
  14. logfile_backups=10
  15. # 記錄日誌級別
  16. loglevel=info
  17. # 指定標準輸出日誌文件
  18. stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
  19. # 環境變數
  20. environment=ASPNETCORE_ENVIRONMENT=Production
  21. # 啟動服務的用戶
  22. user=root
  23. # 把stderr重定向到stdout,預設 false
  24. redirect_stderr=true

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

  1. [program:core50test]
  2. command=/bin/bash -c "dotnet Core50Test.dll"
  3. directory=/root/app_data/core50test/publish
  4. autostart=true
  5. autorestart=true
  6. logfile_maxbytes=50MB
  7. logfile_backups=10
  8. loglevel=info
  9. stdout_logfile=/root/app_data/data/logs/core50test/core50test.out.log
  10. environment=ASPNETCORE_ENVIRONMENT=Production
  11. user=root
  12. redirect_stderr=true

註意:stdout_logfile指向的文件夾一定要先創建,否則無法啟動,上述配置文件中的內容需要根據用戶實際情況修改,如我當前登錄的用戶是:yonghu,你們是其他的就做相應的修改即可。

然後執行如下命令來重新載入配置:

  1. supervisorctl reload

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

supervisor正在運行的應用

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

如下圖所示。

image-20210114150451949

我們可以方便的通過supervisor提供的web管理界面對我們的應用進行啟動與停止,查看日誌等操作,非常的方便,絲般潤滑般的爽呀。

Supervisor啟動與停止應用

查看日誌:

查看日誌

  1. ### 查看supervisorctl支持的命令
  2. # supervisorctl help
  3. default commands (type help <topic>):
  4. =====================================
  5. add exit open reload restart start tail
  6. avail fg pid remove shutdown status update
  7. clear maintail quit reread signal stop version
  8.  
  9. ### 查看當前運行的進程列表
  10. # supervisorctl status

Supervisor常用命令

  • 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

最常用的幾個命令為:

  1. #啟動所有
  2. supervisorctl start all
  3.  
  4. # 重啟所有
  5. supervisorctl restart all
  6.  
  7. # 停止所有
  8. supervisorctl stop all
  9.  
  10. #PS:要操作某個服務,把all換成服務名即可
  11. #查看服務狀態
  12. supervisorctl status

在前面文章中,我們已經可以非常方便的對web應用進行部署與管理了,但還存在一個問題,我們的應用程式預設是綁定的5000埠,如果要指定80埠或者配置功能變數名稱該怎麼處理呢?下麵就該nginx登場了。

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

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

安裝先決條件:

  1. sudo yum install -y yum-utils

安裝yum-utils

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

  1. [nginx-stable]
  2. name=nginx stable repo
  3. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  4. gpgcheck=1
  5. enabled=1
  6. gpgkey=https://nginx.org/keys/nginx_signing.key
  7. module_hotfixes=true
  8.  
  9. [nginx-mainline]
  10. name=nginx mainline repo
  11. baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  12. gpgcheck=1
  13. enabled=0
  14. gpgkey=https://nginx.org/keys/nginx_signing.key
  15. module_hotfixes=true

image-20210114161247091

預設情況下,使用穩定 nginx 包的存儲庫。如果要使用主線 nginx 包,請運行以下命令:

  1. yum-config-manager --enable nginx-mainline

運行如下命令安裝nginx:

  1. sudo yum install -y nginx

安裝nginx

設置開機啟動:

  1. systemctl enable nginx

啟動nginx:

  1. systemctl start nginx

設置nginx開機啟動並啟動nginx

此時,就可以在瀏覽器通過ip訪問了:http://你的ip,界面如下:

nginx啟動界面

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

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass http://0.0.0.0:5000;
  6. }
  7. error_page 500 502 503 504 /50x.html;
  8. location = /50x.html {
  9. root /usr/share/nginx/html;
  10. }
  11. }

保存後,執行如下命令,重新載入配置:

  1. nginx -s reload

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

以nginx方式運行

如果部署後遇到類型下麵這樣的錯誤

502網關錯誤

出現這樣的問題,有可能的是因為SeLinux的限制,執行如下命令之後,再刷新頁面:

  1. setenforce 0

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

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

如果設置後還是不能解決,可以查看nginx的日誌了,預設的日誌路徑為:/var/log/nginx

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

可以通過修改/etc/selinux/config 文件,將SELINUX=enforcing改為SELINUX=disabled,然後重啟,即可永久生效。

image-20210114181544503

通過近兩篇文章的介紹,我們需要更新應用,只需要將代碼提交到git倉庫,然後在伺服器中執行git pull和dotnet publish即可。

如果熟悉shell的話,可以通過編寫shell命令一鍵執行應用程式的更新,代碼示例:

  1. # !/bin/bash
  2. cd /root/app_data/source/core50test
  3. git pull
  4. dotnet publish -o /root/app_data/core50test/publish
  5. supervisorctl restart core50test

將上述的代碼保存為sh文件,上傳到伺服器,並設置許可權。如下圖所示:

image-20210115155730265

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

  1. ./build.sh

執行結果如下圖所示:

shell教本部署

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

image-20210115113537048

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

  1. $'\r':command not found

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

shell命令 unix格式設置

supervisor一個作為守護線程,用於維護應用程式的生命周期的,nginx則是作為反向代理使用,配置shell可以做到高效部署,非常的方便。

 

作者|國思軟體

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/The-most-comprehensive-solution-for-deploying-NET-Core-to-Linux-CentOS-Advanced-Supervisor_Nginx.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載請註明 來源:http://www.eword.name/ Author:eword Email:[email protected] 安裝Python 一、查詢是否安裝了Python及安裝路徑 #查看當前Python版本 python --version Python 2.7.16 #查看當前所有 ...
  • B/S結構系統的會話機制(session) 每博一文案 你跑得快,22歲有個家,身邊全是贊嘆,你跑得慢,30歲還在路上追求夢想。有的人為了車,房拼了一輩子, 有的人買輛摩托車走遍了大好江山。你想成為怎樣的人,過怎樣的生活,只要你不後悔就行。 並不是所有人都能在早上七點鐘起床的,也別拿一碗飯來衡量一個 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十三之緩存操作 這一節介紹一下如何在 Django 中使用 redis 做緩存操作。 在 Django 中可以有很多種方式做緩存,比如資料庫,比如伺服器文件,或者記憶體,這裡介紹用的比較多的使用 redis 作為緩存。 這篇筆記主要內容如 ...
  • 大部分程式員走入編程世界第一個學習的語言就是C語言。 作為一門古老的編程語言,c語言擁有48年的發展歷程。 為什麼要學習 C語言? C語言是學習電腦程式設計語言的入門語言。最全面的編程面試網站 C語言是一門偏底層的語言,學好它,可以讓你更好的瞭解電腦。 學會了C語言,你就能學習現在任何的高級編程 ...
  • 在前幾篇文章中`LyShark`通過多種方式實現了驅動程式與應用層之間的通信,這其中就包括了通過運用`SystemBuf`緩衝區通信,運用`ReadFile`讀寫通信,運用`PIPE`管道通信,以及運用`ASYNC`反向通信,這些通信方式在應對`一收一發`模式的時候效率極高,但往往我們需要實現一次性... ...
  • P6818 [PA2013]Działka 前言 我太菜了。。。。 對著 jiangly 大佬的題解研究了一下午研究了一下午才搞出來(淚目。 作為一個蒟蒻,我就詳細的講一下我對與本題的理解。 題意 本題的的題意描述的還是比較明瞭。 在二維坐標系中,輸入 $n$ 個點 $m$ 次詢問, 每次詢問,給出 ...
  • 測試環境 Python 3.6.2 代碼實現 非多線程場景下使用 新建並保存EXCEL import win32com.client from win32api import RGB def save_something_to_excel(result_file_path): excel_app = ...
  • 以前寫的C++基本都是C with STL,大多是面向過程的演算法題,或者比較小的項目,然後經常報各種編譯錯誤(對編譯原理不熟),經常把人搞到崩潰,搞不懂構建、鏈接之類的東西。 現在開始記錄一下XMake的學習筆記,記錄一些學習過程中踩的坑,在這篇文章,你將學習到Windows下利用MSYS2進行Mi ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...