Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站
點擊上方藍字關注“汪宇杰博客”
導語
微軟智慧云 Azure 上雖然早就有 App Service 這種完全托管的 PaaS 服務可以讓我們分分鐘建網站。但是不自己配一下環境,就不能體現技術含量,容易被說微軟的人都只會點鼠標。年輕的時候不敲命令,什么時候可以?今天就教大家如何在 Azure 上用 Windows Server 2019 (Server Core) VM 的方式自己配環境部署 ASP.NET Core 網站。
什么是 Windows Server Core
在微軟開天辟地之時,先知比爾蓋茨認為微軟的使命是讓復雜的計算機變得易用,因此 Windows 用圖形化界面實現了“讓每張桌子、每個家庭都擁有一臺電腦”的使命。而圖形界面也包含了 Windows 的服務器版本,絕大多數服務器組件都可以點鼠標分分鐘裝完。
但微軟不明白,程序員需要的是通過命令行裝逼,而不是早點下班。于是 Linux 靠命令行、模塊化、輕量級統治了服務器的半壁江山,讓程序員和運維充分裝到了逼。而且 Windows 服務器還有個問題,就是由于有完整的桌面 GUI,因此服務器硬件的資源并沒有最大化利用來處理業務。微軟一看,這樣不行啊,于是在 Windows Server 2008 的時候推出了 Core 版本。
它是在部署 Windows Server Standard 或 Datacenter 版本時可用的最小安裝選項。Server Core 包括大多數但并非全部服務器角色。相比完整桌面,Core 版本剔除了絕大部分GUI,并且你只安裝需要的服務器角色,這樣不僅降低了硬件開銷,也降低了被攻擊的風險。管理 Server Core 服務器基本通過命令行完成,易于裝逼。
如果想要完全沒有 GUI 的 Windows 服務器,可以了解一下 nano server,但這不是本文的議題,因此不暫不討論。
使用傳送門了解 Windows Server Core:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
在 Azure 創建 Server Core 虛擬機
和創建其他虛擬機一樣,在 Azure Portal 中創建 Server Core 虛擬機。鏡像不在默認下拉列表里,需要自己從 "Browse all public and private images" 里搜出來。
鏡像名稱:
Windows Server 2019 Datacenter Server Core
由于我們要運行的是 ASP.NET Core 網站,并需要使用RDP登錄服務器進行配置,所以建議開放 80,443,3389端口。
因為測試用途,我選擇不配置防火墻,暴露所有端口到公網(也會忽略上一步的端口設置)。在真實環境中,請不要這樣操作。
等服務器部署完成后,點擊 DNS name 中的 "Configure" 配置一個域名。這是因為Azure上的VM默認IP地址是動態的,所以最好通過域名來訪問,保證隨時能找到你的服務器。
分配一個域名前綴
配置完成后,刷新 VM 主頁,可以查看和復制用于訪問虛擬機的域名。
登錄 Server Core 服務器
點擊 "Connect"
選擇 Download RDP File
使用創建服務器時設置的賬號密碼登錄 Server Core VM
此時大家會發現,Server Core 并不是完全沒有GUI,而是最小化了 GUI 的存在。cmd 窗口依然是Windows渲染的。之后我們要用到的注冊表編輯器也是 GUI 方式操作。
安裝和配置 IIS
首先,借用我以前寫的自動裝機腳本(https://github.com/EdiWang/EnvSetup)里的一部分來安裝IIS(除ASP.NET,因為我們用的是.NET Core,和經典ASP.NET沒關系)
使用powershell命令,在cmd下啟動powershell
powershell
然后依次執行
Enable-WindowsOptionalFeature-Online -FeatureName IIS-DefaultDocument -All
Enable-WindowsOptionalFeature-Online -FeatureName IIS-HttpCompressionDynamic -All
Enable-WindowsOptionalFeature-Online -FeatureName IIS-HttpCompressionStatic -All
Enable-WindowsOptionalFeature-Online -FeatureName IIS-WebSockets -All
Enable-WindowsOptionalFeature-Online -FeatureName IIS-ApplicationInit -All
Enable-WindowsOptionalFeature-Online -FeatureName IIS-ServerSideIncludes
Enable-WindowsOptionalFeature-Online -FeatureName IIS-BasicAuthentication
Enable-WindowsOptionalFeature-Online -FeatureName IIS-WindowsAuthentication
這一步應該也能通過 Install-WindowsFeature Web-Server 命令完成,但我沒試過,大家可以自己實踐
然后安裝管理服務
Install-WindowsFeatureWeb-Mgmt-Service
運行?regedit?啟動注冊表編輯器,改一個注冊表值
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server
將?EnableRemoteManagement 改為 1
執行 exit 退出 powershell 回到 cmd,我們要將 wmsvc 設置為開機自啟動
scconfig wmsvc start=auto
然后啟動 wmsvc 服務
netstart wmsvc
并且要允許Windows防火墻(和Azure NSG無關)通過這個服務
netsh advfirewall firewall add rule name=”IIS Remote Management” dir=in action=allow service=WMSVC
安裝 ASP.NET Core 服務器環境
盡管我們可以通過 powershell 去下載.NET Core運行時然后手工安裝,但這樣并不方便,逼格也不高。Windows上其實有個類似 Linux 里 apt 那樣的命令行包管理工具,叫做?chocolatey,我們可以通過它在命令行下全自動安裝大量軟件。
再次鍵入 powershell,然后執行以下命令安裝 choco
Set-ExecutionPolicyBypass -Scope Process -Force; iex ((New-ObjectSystem.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
完成后,鍵入 choco 檢查是否能識別
執行以下命令,全自動安裝 ASP.NET Core 服務器運行環境
chocoinstall dotnetcore-windowshosting -y
它將安裝 x86, x64 兩個運行時,以及 IIS 的 ANCM 模塊
安裝和配置 Web Deploy
使用 choco 安裝 Web Deploy,該組件之后用于遠程發布 ASP.NET Core 網站。
chocoinstall webdeploy -y
完成后重啟一下 w3svc 服務
net stop w3svc
net start w3svc
IIS 遠程管理
現在,我們能夠在IIS管理器里遠程連接到這臺服務器進行網站發布。這可以在任何帶有 IIS 7 以上管理器的機器上完成,比如我們自己的 Windows 10 客戶端。
如果沒有安裝過 IIS 管理器,可以運行 optionalfeatures 并勾選 Internet Information Serviece / Web Management Service / IIS Management Console 安裝。
然后要自己去下一個?IISManager for Remote Administration 1.2,傳送門:
https://www.microsoft.com/en-us/download/details.aspx?id=41177
安裝完成后,啟動 IIS 管理器,選擇 File-> Connect to a Server?
輸入我們的服務器地址,即 Azure 上配過的那個DNS名稱
忽略證書警告,點 Connect?
這時候可能會彈一堆關于 Web Deploy 的可選安裝組件,全選并安裝
然后在IIS里就能用你熟悉的點鼠標方式,管理服務器上的網站了,非常不996,一點也沒有福報。
我們做的第一件事應該是檢查 ASP.NET Core 的 ANCM 模塊有沒有安裝成功。進入 Modules
檢查是否有 AspNetCoreModule 以及?AspNetCoreModuleV2
當然,你也可以在服務器上使用 dotnet --info 命令檢查運行時版本。
因為要刷新環境變量最方便的辦法是重啟cmd,然而我們在服務器上退出cmd以后,因為沒有完整桌面,不知道哪里去啟動cmd,其實可以通過 CTRL SHIFT ESC 調出任務管理器,然后運行cmd命令,開一個新的cmd出來。
然后就能愉快的運行 dotnet --info 了
服務器玩夠了,就回到我們老實的 Windows 10 客戶端。在 IIS 里給默認網站開個https支持,因為 .NET Core 現在默認會啟用https(盡管我們沒有證書)
在 Bindings 里,添加https/443的支持,并勾選一個IIS自帶的臨時證書
然后嘗試訪問 http/https 兩個協議的網址,也就是你的VM DNS名稱,忽略證書警告,應該都能打開
萬一打不開,或者無法連接遠程服務器的IIS,可以先喝熱水,然后到服務器上用 Powershell 的 Restart-Computer 命令重啟試試。實在不行,刪庫跑路,也挺省心,Azure 刪 VM 只要幾秒鐘……
發布 ASP.NET Core 網站
雖然類似于Azure DevOps 的 CI / CD 工具完全能對接 Web Deploy 全自動發布網站,但這樣的體驗太沒技術含量了,無法 996,沒有夢想。因此我教大家開手動擋操作:
將一個 ASP.NET Core 網站編譯,并發布到本地文件系統。然后把發布出來的文件打個zip壓縮包。
然后回到IIS里,在服務器端的網站上點右鍵,選擇 Deploy / Import Application
選擇剛才打包的zip文件
選擇zip包內全部內容
輸入網站名稱(一定要和IIS管理器里顯示的網站名稱一毛一樣)
根據自己需要,選擇是否刪除目標位置多余文件
完成zip包導入
現在IIS管理器里就能看見網站目錄下的所有文件了~
嘗試訪問一下VM的網址,網站成功運行,非常牛逼
參考文檔:https://blogs.msdn.microsoft.com/benjaminperkins/2015/11/02/configure-an-iis-server-core-server-for-remote-management/
總結
以上是生活随笔為你收集整理的Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 微软开源基于.NET Core的量子开发
 - 下一篇: 「PowerBI」使用TabularEd