歡迎光臨
每天分享高質量文章

Asp.NetCore輕鬆學-部署到 Linux 進行託管

前言

上一篇文章介紹瞭如何將開發好的 Asp.Net Core 應用程式部署到 IIS,且學習了行程內託管和行程外託管的區別;接下來就要說說應用 Asp.Net Core 的特性(跨平臺),將 .NetCore 部署到 Linux 中,主流的 Linux 有多個版本的作業系統,這裡以 Centos-7.5 為例子,其它版本的作業系統下的部署基本都是大同小異的,除了了一些命令上的區別。

在 Linux 上部署 .Net Core 應用程式,通常的做法是使用託管宿主,早在 1.0.4 的時代,曾經推薦的做法是使用自託管,即 Kestrel,後來官方主力推薦使用 Supervisor 進行託管部署;當然,還有如今最流行的 Docker 部署,但是 Docker 部署不在本文討論範圍,這次我們主要講講怎麼使用 “Kestrel” 和 “Supervisor” 進行部署。

準備過程

為了演示部署,我專門到 Azure 上申請了 1 元使用套餐,建立了一個 Centos-7.5 的虛擬機器,申請過程非常輕鬆愉快,支付 1 元即可完成 1500 元的信用額度,使用期限 30 天,童叟無欺,推薦大家申請,用作測試學習的機器。

花了幾分鐘,機器拿到了,感謝 Azure 的友情支援

SSH 連線到虛擬機器,他是長這個樣子的,輸入命令 cat /etc/redhat-release 檢視版本

大家拿到一臺機器的時候,一定要確認一下作業系統的版本,因為 ubuntu 和 centos 下的有些命令是不同的,比如 ubuntu 使用 apt-get,而 centos 使用 yun

1. 自託管的部署-使用 Kestrel

好了,機器已經拿到,系統已經確認,下麵的工作首先就是要在 Centos 上安裝 .net core,因為是 Azure ,我抱著幻想輸入 dotnet –version,果然,提示命令不存在,這很工業標準。

1.1 安裝環境

好的,沒問題,我們就按照 https://dotnet.microsoft.com/learn/web/aspnet-hello-world-tutorial/install 的指引進行安裝即可,依次輸入下麵的命令

  1. sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
  2. sudo yum update
  3. sudo yum install dotnet-sdk-2.2

因為現在我們登入的賬號不是 root,所以執行命令期間可能會提示輸入密碼,照做即可,由於是新機器第一次進行 yum update ,可能各種依賴比較多,請耐心等待安裝完成。如果是第一次使用 Linux 的同學,請把 Linux 想象成 Windows 下的 dos 系統操作,這樣就可以實現平滑過渡了。

安裝完成,輸入 dotnet –version 輸出下麵的資訊,證明安裝成功了

1.2 配置服務執行的埠

配置服務執行的埠有兩種方式,之前的文章介紹了使用 hosting.json 檔案的方式,這裡演示為了方便,因為 linux 下要配置防火牆等操作會把新手搞懵逼,我們直接的程式碼中指定 80 埠,程式碼如下

  1.    public class Program
  2.    {
  3.        public static void Main(string[] args)
  4.        {
  5.            CreateWebHostBuilder(args).Build().Run();
  6.        }
  7.  
  8.        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  9.            WebHost.CreateDefaultBuilder(args)
  10.                   .UseKestrel(options =>
  11.                   {
  12.                       options.Listen(IPAddress.Parse("0.0.0.0"), 80);
  13.                   })
  14.                   .UseStartup<Startup>();
  15.    }

非常簡潔的程式碼,僅僅使用 UseKestrel 就可以配置偵聽地址和埠,如果有多塊網絡卡的朋友,註意最好還是指定 IP 地址。

2. 開始釋出

2.1 釋出到本地檔案夾

定位到專案 D:\Learning\Deploy.Linux\Deploy.Linux,輸入 cmd 啟動命令列,輸入以下命令

  1. dotnet publish --runtime centos.7-x64  --framework netcoreapp2.2 --configuration release

執行上述命令後,將會在專案 bin\release\netcoreapp2.2\centos.7-x64\publish 下看到有釋出好的專案檔案和依賴專案

  • 註意:引數 –runtime 是有固定 RID 的,想瞭解更多有關 RID 的知識,請移步 .NET Core RID 目錄

接下來,在伺服器中新建一個檔案夾,在控制臺中輸入命令

  1. sudo mkdir -p /data/sites/demo
  2. // 修改許可權為當前登入使用者,否則無法上傳
  3. sudo chown -R ron:ron /data

將 publish 檔案夾上傳到伺服器上剛才建立好的檔案夾 /data/sites/demo 下,我這裡使用的是 SecureFx ,簡單粗暴,直接複製上傳

2.2 測試啟動

上傳成功後,先不要著急的寫服務檔案,先測試一下是否可以啟動,先使用控制檯進行測試,輸入命令定位到 publish 檔案夾

  1. cd /data/sites/demo/publish
  2. // 啟動,因為要偵聽埠,而且我們使用的不是 root 使用者,這裡需要使用 sudo 進行提權,如果提示輸入密碼,請輸入當前登入使用者的密碼即可
  3. sudo dotnet Deploy.Linux.dll

測試啟動成功,上面輸出的資訊表示,我們的釋出是沒有問題的,先來瞭解一下上面的輸出資訊

  1. // 主機環境:Production
  2. Hosting environment: Production
  3. // 根目錄
  4. Content root path: /data/sites/demo/publish
  5. // 偵聽地址和埠
  6. Now listening on: http://0.0.0.0:80
  7. // 提示關閉技巧,Ctrl+C 可以關閉此主機
  8. Application started. Press Ctrl+C to shut down.

沒有太多的資訊,同樣的簡單明瞭,實際上,現在我們已經透過 80 埠來訪問該站點了,但是作為服務,必須要常駐記憶體中執行,而不是關閉視窗就停止了站點。

2.3 建立常駐服務

所以,接下來我們就編寫一個指令碼檔案,將該站點託管到 Linux 服務中,這個指令碼檔案官網有示例,我們可以直接拿過來用,但是首先,我們得先在系統中建立一個服務檔案 kestrel-dotnet.service

定位到檔案夾 /etc/systemd/system,輸入命令

  1. sudo vi kestrel-dotnet.service
  2.  
  3. // 按 i 將編輯器轉換為輸入樣式
  4. // 將以下內容 copy 到當前編輯器中
  5. [Unit]
  6. Description=Example .NET Web Site running on Centos
  7.  
  8. [Service]
  9. WorkingDirectory=/data/sites/demo/publish
  10. ExecStart=/usr/bin/dotnet Deploy.Linux.dll
  11. Restart=always
  12. # Restart service after 10 seconds if the dotnet service crashes:
  13. RestartSec=10
  14. KillSignal=SIGINT
  15. SyslogIdentifier=dotnet-example
  16. User=root
  17. Environment=ASPNETCORE_ENVIRONMENT=Production
  18. Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
  19.  
  20. [Install]
  21. WantedBy=multi-user.target
  22.  
  23. // 按 esc 鍵推出編輯樣式,輸入命令 :wq! 儲存並退出

透過上面這波操作以後,你就得到了一個服務檔案 kestrel-dotnet.service,這是一個標準的 Linux 服務配置檔案

經過上面的一系列操作,對於還沒有接觸過 Linux 的同學來說,已經有點疲憊了,再堅持一下,馬上就好

現在將建立好的服務檔案註冊到系統中,然後啟動它,依次輸入以下命令

  1. // 註冊服務
  2. sudo systemctl enable kestrel-dotnet.service
  3. // 啟動服務
  4. sudo systemctl start kestrel-dotnet.service

好了,現在訪問我們的站點,目前我的站點是:
http://139.219.9.102/
在服務沒有到期之前,大家應該都是該地址應該是可以訪問的

結束語

寫到這裡,發現文章居然有點長了,對於入門文章來說,這是不合適的,好吧,下一篇再繼續介紹使用 Supervisor 進行託管部署 Asp.Net Core 應用程式

演示程式碼下載:
https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Deploy.Linux

原文地址:https://www.cnblogs.com/viter/p/10408012.html


.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com


 

    贊(0)

    分享創造快樂