前言
上一篇文章介紹瞭如何將開發好的 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 的指引進行安裝即可,依次輸入下麵的命令
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum update
sudo yum install dotnet-sdk-2.2
因為現在我們登入的賬號不是 root,所以執行命令期間可能會提示輸入密碼,照做即可,由於是新機器第一次進行 yum update ,可能各種依賴比較多,請耐心等待安裝完成。如果是第一次使用 Linux 的同學,請把 Linux 想象成 Windows 下的 dos 系統操作,這樣就可以實現平滑過渡了。
安裝完成,輸入 dotnet –version 輸出下麵的資訊,證明安裝成功了
1.2 配置服務執行的埠
配置服務執行的埠有兩種方式,之前的文章介紹了使用 hosting.json 檔案的方式,這裡演示為了方便,因為 linux 下要配置防火牆等操作會把新手搞懵逼,我們直接的程式碼中指定 80 埠,程式碼如下
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Listen(IPAddress.Parse("0.0.0.0"), 80);
})
.UseStartup<Startup>();
}
非常簡潔的程式碼,僅僅使用 UseKestrel 就可以配置偵聽地址和埠,如果有多塊網絡卡的朋友,註意最好還是指定 IP 地址。
2. 開始釋出
2.1 釋出到本地檔案夾
定位到專案 D:\Learning\Deploy.Linux\Deploy.Linux,輸入 cmd 啟動命令列,輸入以下命令
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 目錄
接下來,在伺服器中新建一個檔案夾,在控制臺中輸入命令
sudo mkdir -p /data/sites/demo
// 修改許可權為當前登入使用者,否則無法上傳
sudo chown -R ron:ron /data
將 publish 檔案夾上傳到伺服器上剛才建立好的檔案夾 /data/sites/demo 下,我這裡使用的是 SecureFx ,簡單粗暴,直接複製上傳
2.2 測試啟動
上傳成功後,先不要著急的寫服務檔案,先測試一下是否可以啟動,先使用控制檯進行測試,輸入命令定位到 publish 檔案夾
cd /data/sites/demo/publish
// 啟動,因為要偵聽埠,而且我們使用的不是 root 使用者,這裡需要使用 sudo 進行提權,如果提示輸入密碼,請輸入當前登入使用者的密碼即可
sudo dotnet Deploy.Linux.dll
測試啟動成功,上面輸出的資訊表示,我們的釋出是沒有問題的,先來瞭解一下上面的輸出資訊
// 主機環境:Production
Hosting environment: Production
// 根目錄
Content root path: /data/sites/demo/publish
// 偵聽地址和埠
Now listening on: http://0.0.0.0:80
// 提示關閉技巧,Ctrl+C 可以關閉此主機
Application started. Press Ctrl+C to shut down.
沒有太多的資訊,同樣的簡單明瞭,實際上,現在我們已經透過 80 埠來訪問該站點了,但是作為服務,必須要常駐記憶體中執行,而不是關閉視窗就停止了站點。
2.3 建立常駐服務
所以,接下來我們就編寫一個指令碼檔案,將該站點託管到 Linux 服務中,這個指令碼檔案官網有示例,我們可以直接拿過來用,但是首先,我們得先在系統中建立一個服務檔案 kestrel-dotnet.service
定位到檔案夾 /etc/systemd/system,輸入命令
sudo vi kestrel-dotnet.service
// 按 i 將編輯器轉換為輸入樣式
// 將以下內容 copy 到當前編輯器中
[Unit]
Description=Example .NET Web Site running on Centos
[Service]
WorkingDirectory=/data/sites/demo/publish
ExecStart=/usr/bin/dotnet Deploy.Linux.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
// 按 esc 鍵推出編輯樣式,輸入命令 :wq! 儲存並退出
透過上面這波操作以後,你就得到了一個服務檔案 kestrel-dotnet.service,這是一個標準的 Linux 服務配置檔案
經過上面的一系列操作,對於還沒有接觸過 Linux 的同學來說,已經有點疲憊了,再堅持一下,馬上就好
現在將建立好的服務檔案註冊到系統中,然後啟動它,依次輸入以下命令
// 註冊服務
sudo systemctl enable kestrel-dotnet.service
// 啟動服務
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