.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的几种部署方式但愿对你们有所帮助,固然部份内容我没有写的很详细,是想留给你们以思考,动手尝试下!感谢你们的阅读!

相关文章
相关标签/搜索