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