目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了,通过这一系列的学习你应该能够轻松应对.NET
Core的日常开发了!当然这个CMS系统的一些逻辑处理还需要优化,如没有引入日志组件以及缓存功能,权限目前只支持控制到菜单,却没有控制到具体的功能(其实这块只是苦于样式不会处理,不然的话也会把功能加上),不过话又说回来,这些都是次要的,后期有时间慢慢补上吧,因为我开这个系列的初衷也是对大家入门.NET
Core学习有所帮助!这一章我们将一起部署我们的一路开发过来的网站。如果你觉得文中有任何不妥的地方还请留言或者加入DotNetCore实战千人交流群637326624跟大伙进行交流讨论吧!

本文已收录至《.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
<https://www.cnblogs.com/yilezhu/p/9977862.html>》
作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/10366679.html
<https://www.cnblogs.com/yilezhu/p/10366679.html>

写在前面

既然系统开发好了,那么肯定是要进行部署了,作为一名.NET
Core研发人员如果你不会部署自己的应用的话,明显不是一个合格的程序员。我们知道如果要进行.NET Core的开发的话就需要安装.Net Core
SDK的,如果你仅仅是在服务器上进行.NET Core的部署的话,只需要安装Net Core Runtime即可。
对于SDK以及Runtime的下载你可以点击这里 <https://dotnet.microsoft.com/download>进行下载。

Asp.Net Core 的部署方式

下面我带着大家一起总结下Asp.Net Core的几种部署方式,平时我们使用windows服务器比较多,所以都是iis直接部署的,但是Asp.Net
Core开发的程序不仅仅能部署在windows系统的iis上,它还可以有很多其他的部署方式,下面我就为你一一梳理下,当然这里参考了园子里面“幻天芒”的一篇文章,文章末尾我会给出文章链接。

控制台直接运行

Asp.Net Core 程序在发布后,会产生一个入口 dll 文件,要运行该程序,只需要通过 dotnet 命令执行该 dll
文件即可。所以,第一种方式就是直接找到 dll 文件,并使用 dotnet 命令来运行。(你说 dotnet 命令哪来的?安装了 Runtime
就有了。)当然这里你还可以在运行的时候指定端口号
# 进行控制台执行 dotnet Czar.Cms.Admin.dll --urls=http://localhost:8099
运行结果如下图所示:



IIS部署

用 .Net Framework 开发的应用,大家都比较熟悉用 IIS 来部署。那 .Net Core
呢?虽然两者的运行模式并不相同,但微软为了减少迁移难度,自然也提供了用 IIS 的部署方法。

与 Asp.Net 不同,ASP.NET Core 不再是由 IIS 工作进程(w3wp.exe)托管,而是使用自托管 Web
服务器(Kestrel)运行,IIS 则是作为反向代理的角色转发请求到 Kestrel 不同端口的 ASP.NET Core
程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将 HTTP 响应数据重新回写到 IIS
中,最终转达到不同的客户端(浏览器,APP,客户端等)。

如果要使用 IIS 部署 Asp.Net Core 程序,步骤如下:

*
在托管系统上,创建一个文件夹以包含应用已发布的文件夹和文件。 目录结构
<https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/directory-structure?view=aspnetcore-2.2>
主题中介绍了应用的部署布局。

*
在“IIS 管理器”中,打开“连接”面板中的服务器节点。 右键单击“站点”文件夹。 选择上下文菜单中的“添加网站”。

*
提供网站名称,并将物理路径设置为应用的部署文件夹。 提供“绑定”配置,并通过选择“确定”创建网站:



警告

不应使用顶级通配符绑定(http://*:80/ 和 http://+:80)。 顶级通配符绑定可能会为应用带来安全漏洞。
此行为同时适用于强通配符和弱通配符。 使用显式主机名而不是通配符。 如果可控制整个父域(区别于易受攻击的*.com),则子域通配符绑定(例如,
*.mysub.com)不具有此安全风险。 有关详细信息,请参阅 rfc7230 第 5.4 条
<https://tools.ietf.org/html/rfc7230#section-5.4>。

*
在服务器节点下,选择“应用程序池”。

*
右键单击站点的应用池,然后从上下文菜单中选择“基本设置”。

*
在“编辑应用程序池”窗口中,将“.NET CLR 版本”设置为“无托管代码”:



ASP.NET Core 在单独的进程中运行,并管理运行时。 ASP.NET Core 不依赖加载桌面 CLR。 将“.NET CLR
版本”设置为“无托管代码”为可选步骤。

*
ASP.NET Core 2.2 或更高版本:对于使用进程内托管模型
<https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/index?view=aspnetcore-2.2#in-process-hosting-model>
的 64 位 (x64)独立部署
<https://docs.microsoft.com/zh-cn/dotnet/core/deploying/#self-contained-deployments-scd>
,为 32 位 (x86) 进程禁用应用池。

在 IIS 管理员的“应用程序池”的“操作”侧栏中,选择“设置应用程序池默认设置”或“高级设置”。 找到“启用 32 位应用程序”并将值设置为 False。
此设置不会影响针对进程外托管
<https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#out-of-process-hosting-model>
部署的应用。

*
确认进程模型标识拥有适当的权限。

如果将应用池的默认标识(“进程模型” > “标识”)从 ApplicationPoolIdentity
更改为另一标识,请验证新标识拥有所需的权限,可访问应用的文件夹、数据库和其他所需资源。 例如,应用池需要对文件夹的读取和写入权限,以便应用在其中读取和写入文件。

了解更多,请参考:IIS 部署.Net Core 应用
<https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2#install-the-net-core-hosting-bundle>

目前我们采用的方式就是iis进行部署。

部署为 Windows Service

通过 Windows Service的部署方式,我们能够解决上面控制台直接运行部署的开机启动和持久运行问题,也能避开 iis部署
中的性能损失问题。具体如何做呢?如下提供一种方式(当然,也可以用其他方式来部署 Windows Service):

*
借助 nssm 来管理 Windows Service,Nssm <https://nssm.cc/>,用法,请参考:
https://nssm.cc/usage <https://nssm.cc/usage>

*
配置 Service 开机启动。

*
安装nssm,然后切换到nssm的安装路径,打开控制台

*
运行如下的命令:nssm install <servicename> 从而打开nssm的安装界面如下图所示:



*
就几个选项,很简单,大家安装英文意思进行配置即可。

优势:

* 高性能部署,稳定性好。
* 支持开机启动。
劣势:

* 仅能用于 Windows 服务器。
* 引入了一个外包依赖 NSSM。
Linux 部署

由于 .Net Core 天生支持跨平台,如果在廉价又稳定的 Linux 上部署 .Net Core 程序逐渐成为主流。对于 Linux 上的部署,和
Windows 上并没有什么区别。首先是安装 Runtime 环境,然后拷贝程序,并通过命令行运行。

再进一步,可以使用后台模式,让程序在后台运行。

更进一步,也可以效仿 Windows,把程序启动管理作为一个服务,来达到开机启动和灵活管理的目的。

Docker 部署

作为当前个人认为的最棒的 .Net Core 应用部署方式,建议大家都了解下。目前我们正在尝试进行Docker化,然后用K8S来进行管理。

首先,是 Docker 的基本使用:

* 编写 Dockerfile
* 使用 docker build 构建镜像
* 使用 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的几种部署方式希望对大家有所帮助,当然部分内容我没有写的很详细,是想留给大家以思考,动手尝试下!感谢大家的阅读!