Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

导语

微软智慧云 Azure 上虽然早就有 App Service 这种完全托管的 PaaS 服务可以让我们分分钟建网站。但是不自己配一下环境,就不能体现技术含量,容易被说微软的人都只会点鼠标。年轻的时候不敲命令,什么时候可以?今天就教大家如何在 Azure 上用 Windows Server 2019 (Server Core) VM 的方式自己配环境部署 ASP.NET Core 网站。

640?wx_fmt=gif

什么是 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

640?wx_fmt=gif

在 Azure 创建 Server Core 虚拟机

和创建其他虚拟机一样,在 Azure Portal 中创建 Server Core 虚拟机。镜像不在默认下拉列表里,需要自己从 "Browse all public and private images" 里搜出来。

镜像名称:

Windows Server 2019 Datacenter Server Core

640?wx_fmt=png

由于我们要运行的是 ASP.NET Core 网站,并需要使用RDP登录服务器进行配置,所以建议开放 80,443,3389端口。

640?wx_fmt=png

因为测试用途,我选择不配置防火墙,暴露所有端口到公网(也会忽略上一步的端口设置)。在真实环境中,请不要这样操作。

640?wx_fmt=png

等服务器部署完成后,点击 DNS name 中的 "Configure" 配置一个域名。这是因为Azure上的VM默认IP地址是动态的,所以最好通过域名来访问,保证随时能找到你的服务器。

640?wx_fmt=png

分配一个域名前缀

640?wx_fmt=png

配置完成后,刷新 VM 主页,可以查看和复制用于访问虚拟机的域名。

640?wx_fmt=png

登录 Server Core 服务器

点击 "Connect"

640?wx_fmt=png

选择 Download RDP File

640?wx_fmt=png

使用创建服务器时设置的账号密码登录 Server Core VM

640?wx_fmt=png

此时大家会发现,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 命令完成,但我没试过,大家可以自己实践

640?wx_fmt=png

然后安装管理服务

Install-WindowsFeatureWeb-Mgmt-Service

640?wx_fmt=png

运行 regedit 启动注册表编辑器,改一个注册表值

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server

将 EnableRemoteManagement 改为 1

640?wx_fmt=png

执行 exit 退出 powershell 回到 cmd,我们要将 wmsvc 设置为开机自启动

scconfig wmsvc start=auto

640?wx_fmt=png

然后启动 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 检查是否能识别

640?wx_fmt=png

执行以下命令,全自动安装 ASP.NET Core 服务器运行环境

chocoinstall dotnetcore-windowshosting -y

它将安装 x86, x64 两个运行时,以及 IIS 的 ANCM 模块

640?wx_fmt=png

安装和配置 Web Deploy

使用 choco 安装 Web Deploy,该组件之后用于远程发布 ASP.NET Core 网站。

chocoinstall webdeploy -y

640?wx_fmt=png

完成后重启一下 w3svc 服务

net stop w3svc

net start w3svc

640?wx_fmt=png

IIS 远程管理

现在,我们能够在IIS管理器里远程连接到这台服务器进行网站发布。这可以在任何带有 IIS 7 以上管理器的机器上完成,比如我们自己的 Windows 10 客户端。

如果没有安装过 IIS 管理器,可以运行 optionalfeatures 并勾选 Internet Information Serviece / Web Management Service / IIS Management Console 安装。

640?wx_fmt=png640?wx_fmt=png

然后要自己去下一个 IISManager for Remote Administration 1.2,传送门:

https://www.microsoft.com/en-us/download/details.aspx?id=41177

安装完成后,启动 IIS 管理器,选择 File-> Connect to a Server 

640?wx_fmt=png

输入我们的服务器地址,即 Azure 上配过的那个DNS名称

640?wx_fmt=png

忽略证书警告,点 Connect 

640?wx_fmt=png

这时候可能会弹一堆关于 Web Deploy 的可选安装组件,全选并安装

640?wx_fmt=png

然后在IIS里就能用你熟悉的点鼠标方式,管理服务器上的网站了,非常不996,一点也没有福报。

我们做的第一件事应该是检查 ASP.NET Core 的 ANCM 模块有没有安装成功。进入 Modules

640?wx_fmt=png

检查是否有 AspNetCoreModule 以及 AspNetCoreModuleV2

640?wx_fmt=png

当然,你也可以在服务器上使用 dotnet --info 命令检查运行时版本。

因为要刷新环境变量最方便的办法是重启cmd,然而我们在服务器上退出cmd以后,因为没有完整桌面,不知道哪里去启动cmd,其实可以通过 CTRL SHIFT ESC 调出任务管理器,然后运行cmd命令,开一个新的cmd出来。

640?wx_fmt=png

然后就能愉快的运行 dotnet --info 了

640?wx_fmt=png

服务器玩够了,就回到我们老实的 Windows 10 客户端。在 IIS 里给默认网站开个https支持,因为 .NET Core 现在默认会启用https(尽管我们没有证书)

在 Bindings 里,添加https/443的支持,并勾选一个IIS自带的临时证书

640?wx_fmt=png

然后尝试访问 http/https 两个协议的网址,也就是你的VM DNS名称,忽略证书警告,应该都能打开

640?wx_fmt=png

万一打不开,或者无法连接远程服务器的IIS,可以先喝热水,然后到服务器上用 Powershell 的 Restart-Computer 命令重启试试。实在不行,删库跑路,也挺省心,Azure 删 VM 只要几秒钟……

640?wx_fmt=png

发布 ASP.NET Core 网站

虽然类似于Azure DevOps 的 CI / CD 工具完全能对接 Web Deploy 全自动发布网站,但这样的体验太没技术含量了,无法 996,没有梦想。因此我教大家开手动挡操作:

将一个 ASP.NET Core 网站编译,并发布到本地文件系统。然后把发布出来的文件打个zip压缩包。

640?wx_fmt=png

然后回到IIS里,在服务器端的网站上点右键,选择 Deploy / Import Application

640?wx_fmt=png

选择刚才打包的zip文件

640?wx_fmt=png

选择zip包内全部内容

640?wx_fmt=png

输入网站名称(一定要和IIS管理器里显示的网站名称一毛一样)

640?wx_fmt=png

根据自己需要,选择是否删除目标位置多余文件

640?wx_fmt=png

完成zip包导入

640?wx_fmt=png

现在IIS管理器里就能看见网站目录下的所有文件了~

640?wx_fmt=png

尝试访问一下VM的网址,网站成功运行,非常牛逼

640?wx_fmt=png640?wx_fmt=gif

参考文档:https://blogs.msdn.microsoft.com/benjaminperkins/2015/11/02/configure-an-iis-server-core-server-for-remote-management/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树

传送门 文章目录题意:思路:题意: 思路: 首先肯定不能模n!n!n!,所以考虑先将a,ba,ba,b做一个逆康托展开,得到a′,b′a,ba′,b′数组,以及a′b′sumabsuma′b′sum数组,让后我们可以通…

「PowerBI」使用TabularEditor进行PowerBIDeskTop模型开发最佳实践

前面系列文章介绍的场景,设定的工具使用对象是Sqlserver和Azure 的SSAS数据模型开发,其实TabularEditor亦可以有限度地使用在PowerBIDeskTop的模型开发上,本文简单介绍下其最佳的使用场景。PowerBIDeskTop模型不同于Sqlserver的SSAS模型虽然大…

E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)

Three Blocks Palindrome (hard version) 思路 考虑到每个数字的范围是12001 ~ 2001 200,于是我们可以通过枚举两侧的元素来寻找最优答案。 我们有一个贪心策略,两侧都以我们枚举的元素作为结尾点,假如我们当前枚举的数字是1,于…

树莓派 + Windows IoT Core 搭建环境监控系统

前言:Windows IoT 是微软为嵌入式开发板设计的一种物联网操作系统,运行Windows UWP(C# 开发),可以设计出丰富的交互界面,驱动GPIO,连接一些传感器做有意思的事,本文详细介绍如何使用…

CF1547F Array Stabilization (GCD version) st表 + 尺取/二分

传送门 题意: 思路: 容易发现,我们将所有aaa都除上所有aaa的gcdgcdgcd,实际上就是让你求一个最小的lenlenlen,对于所有iii,gcd(ai,ai1,...,ailen−1)1gcd(a_i,a_{i1},...,a_{ilen-1})1gcd(ai​,ai1​,...…

Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: ac/ba c / bac/b这个时候两个的单价是相同的,如果b1b 1b1,也就是aca cac,无论买多少数量的东西,这两个的价格都是一样的&…

HttpClientFactory 使用说明 及 对 HttpClient 的回顾和对比

在 C# 中,平时我们在使用 HttpClient 的时候,会将 HttpClient 包裹在 using 内部进行声明和初始化,如:using(var httpClient new HttpClient()){ }至于为什么?无外乎是:项目代码中就是这样写的&#xf…

记录用友T+接口对接的心酸历程

前言:公司的业务主要是对接财务系统做单据传输或者凭证处理的,难免少不了和各大财务软件做数据对接,其中当然是必须通过接口来传递数据了。于是乎,用友T的版本来了,对接的工作自然是我来做,可没想到就是这样…

集群故障处理之处理思路以及听诊三板斧(三十四)

前言 本篇主要分享一些处理故障和问题绝招,比如听诊三板斧:1)查看日志2)查看资源详情和事件3)查看资源配置(YAML)如果还是不太好分析,那就祭出神器——kubectl-debug。最后&…

selenium搜狗搜图简单操作(爬取任意关键字的图片)

Picture preview Steps 这里以搜狗搜图作为一个简单的例子: 第一步就是获取我们的需求了,输入需要下载的图片名字以及需要下载的图片数量。 接下来我们需要在搜狗搜图中输入用户的需求,透过xpathxpathxpath锁定搜索框,然后输入…

Microsoft REST API指南

经过3个月的碎片时间的翻译和校验,由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南 》已经翻译完成,现刊载前十一章如下,欢迎大家点击“查看原文”按钮,查看指南的完整内容。PS:内容很长,全…

如何优雅地替换一个实现

前两天,我所在的项目有一个小的技术改动,打算把访问Redis的密码从数据库挪到配置文件里。以前的代码类似下面这样:用户第一次调用GetDatabase时,根据传入的数据库连接字符串访问数据库,从某个表里取出带密码的Redis连接…

莫队——三种题型

普通莫队 P3901 数列找不同 Thinking 一定是用可以用莫队来写题&#xff0c;这点是不用质疑的&#xff0c;所以那就简单了&#xff0c;只需要判断每次询问的区间是否满足r−l1numr - l 1 numr−l1num就行了。 Coding1Coding_1Coding1​ 莫队写法 #include <bits/stdc…

P5357 【模板】AC自动机(二次加强版) fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个只能搞failfailfail树了&#xff0c;让后跑一遍即可。 重复的字符串记一个&#xff0c;让后其他的都跟他一个答案即可。 // Problem: P3796 【模板】AC自动机&#xff08;加强版&…

10分钟了解一致性hash算法

应用场景当我们的数据表超过500万条或更多时&#xff0c;我们就会考虑到采用分库分表&#xff1b;当我们的系统使用了一台缓存服务器还是不能满足的时候&#xff0c;我们会使用多台缓存服务器&#xff0c;那我们如何去访问背后的库表或缓存服务器呢&#xff0c;我们肯定不会使用…

创业周年记:召唤神龙一周年小记

2018年8月8日&#xff0c;我决定离开腾讯的光环&#xff0c;辞职开始创业。《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》记录了我所说的拥有七龙珠&#xff0c;去召唤神龙&#xff0c;今天正好历时一年时间&#xff0c;非常有必要来回顾过去一年的创业历程。迎接…

「数据ETL」从数据民工到数据白领蜕变之旅(三)-除了Excel催化剂之外PowerQuery新物种同样值得期待...

在自助式BI时代以前&#xff0c;Excel级别的数据ETL工作&#xff0c;非常低效&#xff0c;动不动就要启用VBA来完成一些常见的需求&#xff0c;自带的原生功能&#xff0c;未能满足大量的繁琐数据ETL刚需功能。在Excel2010后&#xff0c;PowerQuery以插件的形式横空出现&#x…

Docker系列之烹饪披萨(二)

上一篇我们讲解了虚拟机和容器的区别&#xff0c;本节我们来讲讲Docker中关于Dockerfile、镜像、容器等基本概念。Docker是一个在容器内开发、部署、运行应用程序的平台&#xff0c;Docker本质上是容器化的代名词&#xff0c;容器对于提高软件开发和数据科学的安全性&#xff0…

史上最能“拜客户教”的公司,是如何做到持续交付的?(第2趴)|DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究 –Amazon持续交付之道战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

ASP.NET Core on K8S深入学习(3)Deployment

上一篇《部署过程解析与安装Dashboard》中我们了解K8S的部署过程&#xff0c;这一篇我们来了解一下K8S为我们提供的几种应用运行方式&#xff1a;Deployment、DaemonSet与Job&#xff0c;它们是Kubernetes最重要的核心功能提供者。考虑到篇幅和更新速度&#xff0c;我将其分为两…