实战Asp.Net Core:部署应用

原文:实战Asp.Net Core:部署应用

1、前言

某一刻,你已经把 .Net Core 的程序写好了。接下来,还可以做什么呢?那就是部署了。

作为一名开发工程师,如果不会部署自己开发的应用,那么这也是不完整的。接下来,我们就来说说,如何部署我们的 .Net Core 应用程序(主要是 Asp.Net Core 应用)。

2、Asp.Net Core 的部署方式

对于虚拟机中执行的语言来说,大都会有 SDK(Software Development Kit) 以及 XRE(X Runtime Environment)。对于 C#来说,也不例外。在 C#中,这两者的区别在于:

  • .Net Core SDK 用于开发者构建 App,包含有较多开发相关的工具包(实际上,SDK 也是包含 Runtime)
  • .Net Core Runtime 仅作为运行时使用,不包含开发工具包,体积较小。

既然要部署 Asp.Net Core,自然离不开 Runtime(如果装 SDK 也能跑,不过不推荐在运行环境装 SDK)。以下的部署方式的前提都是已经安装 Runtime 环境。

下载地址:https://dotnet.microsoft.com/download

2.1、控制台直接运行

Asp.Net Core 程序在发布后,会产生一个入口 dll 文件,要运行该程序,只需要通过 dotnet 命令执行该 dll 文件。所以,第一种方式就是直接找到 dll 文件,并使用 dotnet 命令来运行。(你说 dotnet 命令哪来的?安装了 Runtime 就有了。)

# 进行控制台执行
dotnet xxx.dll

优势:

  1. 足够简单,拷贝文件就开整。
  2. 兼容多平台部署。

缺陷:

  1. 想象一下,如果控制台关掉了,服务器重启了会怎样?此时需要手动重新去重新执行。(你说,可不可以设置为开机启动?如果创建一个批处理,放在启动项中,还是能做到的)

2.2、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 程序,步骤如下:

  1. 首先,需要安装 .Net Core 托管捆绑包,点此下载捆绑包
  2. 进行 IIS 控制台,确保能在模块中找到 AspNetCoreModule 托管模块。(如果执行了步骤 1,未找到,可以尝试控制台执行 iisreset)
  3. 按照常规部署 .Net Framework 程序的方式,创建应用,在选择应用程序池的时候,注意,一定要选择无托管代码,如图:
  4. 至此,就算部署成功了。

优势:

  1. 学习成本低,和 .Net Framework 应用的部署方式保持类似。
  2. 能够自动开机自启。
  3. 可以在可视化界面中,配置端口域名绑定。

劣势:

  1. 该方式仅能在 Windows 服务器上使用。
  2. 通过 IIS 桥接一层,有性能损失。

了解更多,请参考:IIS 部署.Net Core 应用

2.3、部署为 Windows Service

在 2.2 的部署方式中,较大的缺陷就是性能损失。那么,有没有什么办法能够可以避开这个问题呢?。答案就是 Windows Service,通过 Windows Service,我们能够解决 2.1 中的开机启动和持久运行问题,也能避开 2.2 中的性能损失。具体如何做呢?如下提供一种方式(当然,也可以用其他方式来部署 Windows Service):

  1. 借助 nssm 来管理 Windows Service,Nssm,用法,请参考:https://nssm.cc/usage
  2. 配置 Service 开机启动。

优势:

  1. 高性能部署,稳定性好。
  2. 支持开机启动。

劣势:

  1. 仅能用于 Windows 服务器。
  2. 引入了一个外包依赖 NSSM。

2.4、Linux 部署

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

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

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

2.5、Docker 部署

作为当前个人认为的最棒的 .Net Core 应用部署方式,建议大家都了解下。

首先,是 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 这类作为基础镜像。

参考文档

  1. https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2#install-the-net-core-hosting-bundle
  2. https://hub.docker.com/r/microsoft/dotnet
  3. https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images?view=aspnetcore-2.2

本文Github地址

原文地址:https://www.cnblogs.com/lonelyxmas/p/10332527.html

时间: 2024-07-30 07:15:28

实战Asp.Net Core:部署应用的相关文章

实战Asp.Net Core:DI生命周期

原文:实战Asp.Net Core:DI生命周期 title: 实战Asp.Net Core:DI生命周期 date: 2018-11-30 21:54:52 --- 1.前言 Asp.Net Core 默认支持 DI(依赖注入) 软件设计模式,那使用 DI 的过程中,我们势必会接触到对象的生命周期,那么几种不同的对象生命周期到底是怎么样的呢?我们拿代码说话. 关于 DI 与 IOC: 个人理解:IOC(控制反转) 是目的(降低代码.服务间的耦合),而 DI 是达到该目的的一种手段(具体办法).

你真的了解ASP.NET Core 部署模型吗?

原文:你真的了解ASP.NET Core 部署模型吗? ----------------------------   以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- 相比ASP.NET,ASP.NET Core 2.1出现了3个新的组件:ASP.NET Core Module.Kestrel.dotnet.exe, 后面我们会理清楚这三个组件的作用和组件之间的交互原理. ASP.NET Core 设计的初

又一篇Centos7下的asp.net core部署教程

原文:又一篇Centos7下的asp.net core部署教程 历程2个多月的学习,我终于从PHP转.Net开发了. 虽然网上已经有很多关于asp.net core在linux下的部署教程了,但我还是想写一篇,主要增强我自己的记忆. 搭建的环境为Centos7 + .net core  + nginx + mysql5.7,我的网站是asp.net core后端,vue前端,数据据mysql: 第一次搭建时遇到不少的坑,我会在下面也说到 前提,你有一台可以联网,有root账号密码,有开通ssh的

asp.net core 部署 提示DataProtectionServices 错误

今天在部署asp.net core网站时,因为调用到阿里云的api,api的参数需要加密签名,系统报出了如下错误: warn: Microsoft.Extensions.DependencyInjection.DataProtectionServices[59] Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailabl

ASP.net Core部署说明(Ubuntu) [转]

最近在学习asp.net core,当然学习的目的是想了解一下,Asp.net core是否真的能够是先跨平台部署. 根据目前官网资料说明,asp.net core只有在Redhat 企业版上,才能够实现所有的功能.不过这个版本是收费的,可能不是大多数人的最佳选择. 笔者目前选择的实验环境是Ubuntu 16.4 和CentOS7这两个平台. 从长远角度来说,CentOS7维护周期长,更加适合企业生产环境.Ubuntu择以更加活跃的社区,更加快速的更新受到欢迎,不过他的维护周期一般只有2~3年,

asp.net core部署到iis

asp.net core项目部署到IIS稍微不同于之前,记录几个要点: 一.下载安装AspNetCoreModule模块,它包含在.NET Core Windows Server Hosting bundle里面,这个链接或许不是最新的了,官方文档里面有这个链接,到下图所示位置即可找到. 安装完之后,会发现多了个模块: 然后重启iis.如果还是出现以下错误: HTTP Error 502.5 - Process Failure Common causes of this issue: The a

ASP.NET Core部署到Windows IIS

网上已经有许多ASP.NET Core关于Widows IIS部署的文章,在部署到服务器时遇到了一些问题,在这里我就不再对原理进行阐释(复制)了,只写下一些关键环节,想看原理的同学请参考官网,此文章作为留用. 步骤: 1.ASP.NET Core程序内配置 2.Windows Server配置  一.ASP.NET Core应用程序配置 web.config 配置(官方教程) 重点修改 processPath 和 arguments 两个参数 processPath 修改为 dotnet arg

ASP.NET Core部署系列一:发布到IIS上

前言: 当构建一个ASP.NET Core应用程序并且计划将其运行在IIS中时,你会发现Core应用程序和之前版本的ASP.NET程序在IIS中的运行方式是完全不一样的.与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响

解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"

问题:部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误 初步解决方案: 1,关闭应用程序池 2,关闭网站 3,更新项目 缺点:网站没法访问,部署项目停的时间过长 查询官方文档后,官方给出的方案: 结合官方文档,找到了一个目前看算是比较好的解决方案(一定要看底部的特别注意) 好点的解决方案(一次配置后,1秒钟更新): 1,在D盘根目录创建一个app_offline.htm文件,注意是.htm文件,不是.html 2,创建一个待发布文件夹,把需要更新的项目文件放到该目录下