.NET Core實戰項目之CMS 第十七章 CMS網站系統的部署

目前咱們的.NET Core實戰項目之CMS系列教程基本走到尾聲了,經過這一系列的學習你應該可以輕鬆應對.NET Core的平常開發了!固然這個CMS系統的一些邏輯處理還須要優化,如沒有引入日誌組件以及緩存功能,權限目前只支持控制到菜單,卻沒有控制到具體的功能(其實這塊只是苦於樣式不會處理,否則的話也會把功能加上),不過話又說回來,這些都是次要的,後期有時間慢慢補上吧,由於我開這個系列的初衷也是對你們入門.NET Core學習有所幫助!這一章咱們將一塊兒部署咱們的一路開發過來的網站。若是你以爲文中有任何不妥的地方還請留言或者加入DotNetCore實戰千人交流羣637326624跟大夥進行交流討論吧!html

本文已收錄至《.NET Core實戰項目之CMS 第一章 入門篇-開篇及整體規劃
做者:依樂祝
原文地址:http://www.javashuo.com/article/p-hvwmjhiv-gp.htmllinux

寫在前面

既然系統開發好了,那麼確定是要進行部署了,做爲一名.NET Core研發人員若是你不會部署本身的應用的話,明顯不是一個合格的程序員。咱們知道若是要進行.NET Core的開發的話就須要安裝.Net Core SDK的,若是你僅僅是在服務器上進行.NET Core的部署的話,只須要安裝Net Core Runtime便可。
對於SDK以及Runtime的下載你能夠點擊這裏進行下載。程序員

Asp.Net Core 的部署方式

下面我帶着你們一塊兒總結下Asp.Net Core的幾種部署方式,平時咱們使用windows服務器比較多,因此都是iis直接部署的,可是Asp.Net Core開發的程序不只僅能部署在windows系統的iis上,它還能夠有不少其餘的部署方式,下面我就爲你一一梳理下,固然這裏參考了園子裏面「幻天芒」的一篇文章,文章末尾我會給出文章連接。docker

控制檯直接運行

Asp.Net Core 程序在發佈後,會產生一個入口 dll 文件,要運行該程序,只須要經過 dotnet 命令執行該 dll 文件便可。因此,第一種方式就是直接找到 dll 文件,並使用 dotnet 命令來運行。(你說 dotnet 命令哪來的?安裝了 Runtime 就有了。)固然這裏你還能夠在運行的時候指定端口號數據庫

# 進行控制檯執行
 dotnet Czar.Cms.Admin.dll --urls=http://localhost:8099

運行結果以下圖所示:c#

1549967609348

IIS部署

用 .Net Framework 開發的應用,你們都比較熟悉用 IIS 來部署。那 .Net Core 呢?雖然二者的運行模式並不相同,但微軟爲了減小遷移難度,天然也提供了用 IIS 的部署方法。windows

與 Asp.Net 不一樣,ASP.NET Core 再也不是由 IIS 工做進程(w3wp.exe)託管,而是使用自託管 Web 服務器(Kestrel)運行,IIS 則是做爲反向代理的角色轉發請求到 Kestrel 不一樣端口的 ASP.NET Core 程序中,隨後就將接收到的請求推送至中間件管道中去,處理完你的請求和相關業務邏輯以後再將 HTTP 響應數據從新回寫到 IIS 中,最終轉達到不一樣的客戶端(瀏覽器,APP,客戶端等)。瀏覽器

若是要使用 IIS 部署 Asp.Net Core 程序,步驟以下:緩存

  1. 在託管系統上,建立一個文件夾以包含應用已發佈的文件夾和文件。 目錄結構主題中介紹了應用的部署佈局。安全

  2. 在「IIS 管理器」中,打開「鏈接」面板中的服務器節點。 右鍵單擊「站點」文件夾。 選擇上下文菜單中的「添加網站」。

  3. 提供網站名稱,並將物理路徑設置爲應用的部署文件夾。 提供「綁定」配置,並經過選擇「肯定」建立網站:

    在「添加網站」步驟中提供網站名稱、物理路徑和主機名。

    警告

    不該使用頂級通配符綁定(http://*:80/http://+:80)。 頂級通配符綁定可能會爲應用帶來安全漏洞。 此行爲同時適用於強通配符和弱通配符。 使用顯式主機名而不是通配符。 若是可控制整個父域(區別於易受攻擊的 *.com),則子域通配符綁定(例如,*.mysub.com)不具備此安全風險。 有關詳細信息,請參閱 rfc7230 第 5.4 條

  4. 在服務器節點下,選擇「應用程序池」。

  5. 右鍵單擊站點的應用池,而後從上下文菜單中選擇「基本設置」。

  6. 在「編輯應用程序池」窗口中,將「.NET CLR 版本」設置爲「無託管代碼」:

    將「.NET CLR 版本」設置爲「無託管代碼」。

    ASP.NET Core 在單獨的進程中運行,並管理運行時。 ASP.NET Core 不依賴加載桌面 CLR。 將「.NET CLR 版本」設置爲「無託管代碼」爲可選步驟。

  7. ASP.NET Core 2.2 或更高版本:對於使用進程內託管模型的 64 位 (x64) 獨立部署,爲 32 位 (x86) 進程禁用應用池。

    在 IIS 管理員的「應用程序池」的「操做」側欄中,選擇「設置應用程序池默認設置」或「高級設置」。 找到「啓用 32 位應用程序」並將值設置爲 False。 此設置不會影響針對進程外託管部署的應用。

  8. 確認進程模型標識擁有適當的權限。

    若是將應用池的默認標識(「進程模型」 > 「標識」)從 ApplicationPoolIdentity 更改成另外一標識,請驗證新標識擁有所需的權限,可訪問應用的文件夾、數據庫和其餘所需資源。 例如,應用池須要對文件夾的讀取和寫入權限,以便應用在其中讀取和寫入文件。

瞭解更多,請參考:IIS 部署.Net Core 應用

目前咱們採用的方式就是iis進行部署。

部署爲 Windows Service

經過 Windows Service的部署方式,咱們可以解決上面控制檯直接運行部署的開機啓動和持久運行問題,也能避開 iis部署 中的性能損失問題。具體如何作呢?以下提供一種方式(固然,也能夠用其餘方式來部署 Windows Service):

  1. 藉助 nssm 來管理 Windows Service,Nssm,用法,請參考:https://nssm.cc/usage

  2. 配置 Service 開機啓動。

  3. 安裝nssm,而後切換到nssm的安裝路徑,打開控制檯

  4. 運行以下的命令:nssm install <servicename> 從而打開nssm的安裝界面以下圖所示:

  5. 就幾個選項,很簡單,你們安裝英文意思進行配置便可。

優點:

  1. 高性能部署,穩定性好。
  2. 支持開機啓動。

劣勢:

  1. 僅能用於 Windows 服務器。
  2. 引入了一個外包依賴 NSSM。

Linux 部署

因爲 .Net Core 天生支持跨平臺,若是在廉價又穩定的 Linux 上部署 .Net Core 程序逐漸成爲主流。對於 Linux 上的部署,和 Windows 上並無什麼區別。首先是安裝 Runtime 環境,而後拷貝程序,並經過命令行運行。

再進一步,可使用後臺模式,讓程序在後臺運行。

更進一步,也能夠效仿 Windows,把程序啓動管理做爲一個服務,來達到開機啓動和靈活管理的目的。

Docker 部署

做爲當前我的認爲的最棒的 .Net Core 應用部署方式,建議你們都瞭解下。目前咱們正在嘗試進行Docker化,而後用K8S來進行管理。

首先,是 Docker 的基本使用:

  1. 編寫 Dockerfile
  2. 使用 docker build 構建鏡像
  3. 使用 docker run 建立容器並運行

好,咱們來依次說明,對於 Docker 來講,須要先安裝 Docker 環境。

接着,咱們假設發佈包路徑以下:

root-folder/
  app/ # 發佈包目錄
    xxx.dll # 程序入口點 
  Dockerfile # Dockerfile文件

而後針對該程序,編寫以下 Dockerfile:

# 根鏡像
FROM microsoft/dotnet:2.2-runtime

# 拷貝程序發佈包
COPY app /app

# 設置工做目錄
WORKDIR /app

# 導出的端口
EXPOST 80

# 程序運行命令
CMD ["dotnet", "xxx.dll"]

接下來,經過在 root-folder 中執行 docker build -t xxx:0.0.1 . 來構建一個鏡像。

接着,再經過 docker run -it -p 8000:80 --name xxx-demo xxx:0.0.1 來建立並運行容器。

這樣,就能夠經過 http://localhost:8000 來訪問到你的應用程序了。

此處只是大概寫下 Docker 部署的步驟,拋磚引玉。真正須要將其用於產線,還須要去學習下足夠的 Docker 知識。

額外提一下,如何選擇基礎鏡像

對於 .Net Core 來講,通常有以下幾類基礎鏡像:

  • sdk -- 相信這個都比較容易理解,就是包含了 .Net Core SDK。
  • runtime -- 這個也相對容易理解,包含了.Net Core Runtime。
  • runtime-deps --這個就不是很好理解, runtime? deps? 什麼意思呢?就是說,這個連 Runtime都不是全的,須要你在打包的時候,選擇自寄宿模式,把Runtime也打進去。
    綜上,我我的推薦你們選擇 runtime 這類做爲基礎鏡像。

總結

今天給你們介紹了asp.net core的幾種部署方式但願對你們有所幫助,固然部份內容我沒有寫的很詳細,是想留給你們以思考,動手嘗試下!感謝你們的閱讀!

相關文章
相關標籤/搜索