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

来源:https://www.cnblogs.com/viter/archive/2019/02/21/10408012.html
-Advertisement-
Play Games

接下來就要說說應用 Asp.Net Core 的特性(跨平臺),將 .NetCore 部署到 Linux 中,主流的 Linux 有多個版本的操作系統,這裡以 Centos-7.5 為例子 ...


前言

上一篇文章介紹瞭如何將開發好的 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


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

-Advertisement-
Play Games
更多相關文章
  • 一.查詢類型 此功能是EF Core 2.1中的新功能。 EF Core除了實體類型之外,EF Core模型還可以包含查詢類型,這些查詢類型是針對“未映射到實體類型”的數據獲取。比如視圖,或只讀數據表。 1.1 下麵介紹下,查詢類型與實體類型共同與不同點: (1) 可以在OnModelCreatin ...
  • 有些場景下,我們需要列舉出Enum中的所有項,比如 Enum轉到下拉列表給用戶選擇,這時我們就需要列出所有項出來了。 ...
  • 現在的項目開發基本上都用到了上傳文件功能,或圖片,或文檔,或視頻。我們常用的常規上傳已經能夠滿足當前要求了, 然而有時會出現如下問題: 我們這裡只講分片上傳,至於斷網續傳和秒傳已經寫好demo,下載路徑放在文末,有興趣的可以下載下來自己玩玩。 分片上傳demo下載地址:https://pan.bai ...
  • 今天給大家推薦一個簡單的獲取手機驗證碼註冊+獲取隨機4位數 測試框架:.net4.7以上 1.榛子雲註冊:http://smsow.zhenzikj.com/,送一條測試簡訊,最低充10元即刻使用 2.註冊完我們在平臺下載一個SDK這是平臺給我們弄好的介面我們只需要下載完就能直接引用了 3.下載好了 ...
  • 需求: 在C#中對一個字元串進行計算得出結果。 例如:“1+2+66+33” 字元串中的數字可以變化,累加(這裡偷懶了限定成累加)的次數可以變化。 思路/解決方案: 1. 用JavaScript中的Eval把字元串轉成對象進行計算 用Com控制項計算方法,引入MSScriptControl.Scrip ...
  • 資源會被打包在程式集內部。 選擇這種生成方式後,該資源文件會被嵌入到該應用的程式集中,就是說打開生成的應用程式目錄是看不到這個文件的。 可以用相對於當前的XAML文件的相對Uri訪問,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子 ...
  • 背景 筆者最近在閱讀《React+Antd共用單車通用後臺管理系統》相關的視頻和筆記,剛好看到項目工程化環節。視頻里簡要介紹了項目工程化的由來和作者項目工程化的一些手段。筆者本人是後臺開發者,由此產生了一些聯想和思考。 背景 筆者最近在閱讀《React+Antd共用單車通用後臺管理系統》相關的視頻和 ...
  • K2流程製作註意事項 1:分析需求 2:實施 步驟1:繪製流程圖 步驟2:添加datafield【必備:ActJumped IsPass】 步驟3:添加線規則(如下圖所示,在添加完畢規則之後,再給同意這條線下添加ActJumped=Jumped) 步驟4:添加dll 步驟5:部署,這時候不用點擊生成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...