一、课程介绍

ASP.NET Core 是一种全新的跨平台开源 .NET 框架,能够在 IIS、Nginx、Apache、Docker 上进行托管或在自己的进程中进行自托管。

作为一个.NET Web开发者,我最伤心的时候就是项目开发部署时面对Windows Server上贫瘠的解决方案,同样是神器Nginx,Win上的Nginx便始终不如Linux上的所幸.ASP.NET Core出现了,它顺应了开源大趋势,摆脱了一直为人诟病的WindowsServer,以ASP.NET Core的跨平台版本出现在了我们的眼前。作为.NET程序员大多数工作无法脱离Windows,习惯于图形化的工作环境,特别对刚接触Linux系统来说感觉使用很不习惯, 所谓工欲善其事,必先利其器,毕竟我们程序员的精力是有限的 ,把有限的时间投入到有价值的事情上去。

1.1、本次分享课程包含知识点如下:
1、为什么asp.net不能跨平台,而asp.net core可以跨平台?
2、asp.net core web服务器HTTP.sys和Kestrel区别以及特点
3、asp.net core两种托管模型以及如何选择?
4、ASP.NET Core的运行机制 
5、VirtualBox下安装Linux CentOS系统
6、两种方式安装.NET Core SDK on Linux CentOS 
7、 Linux CentOS上安装Nginx
8、使用IIS 在 Windows 上托管 ASP.NET Core 
9、使用Nginx 在 Linux 上托管 ASP.NET Core

如果您对本次分享课程《ASP.NET Core托管和部署Linux实操演练手册》感兴趣的话,那么请跟着阿笨一起学习吧。

废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运 !

ASP.NET Core托管和部署Linux实操演练手册_.net

微软高调示爱Linux


二、概念名称含义解释

2.1、为什么asp.net不能跨平台,而asp.net core可以跨平台?

大部分的ASP.NET被传统的System.Web库所限制。.NET Framework支持旧版本的ASP.NET项目,而且这个约束限制了ASP.NET的发展。微软决定重写整个架构。ASP.NET Core 是一个跨平台高性能开源框架,它不是ASP.NET Framework延伸,而是重生,存在质的区别。ASP.NET Core不再是基于System.Web.dll,不再需要依赖IIS与windows!如今,你可以跨所有平台,任意的在Windows、Mac和Linux等设备上开发并且运行你的 ASP.NET Core 应用。当然你也可以用你喜爱的托管程序(IIS、Nginx、Apache、Docker)进行部署

顺便提一下微软更名后的叫法:

ASP.NET 5 更名为 ASP.NET Core 1.0

.NET Core 更名为 .NET Core 1.0

Entity Framework 7 更名为 Entity Framework Core 1.0 或者简称 EF Core 1.0

阿笨个人简单粗暴的解释一下到底是什么制约了asp.net不能跨平台?是.NET Framework框架和IIS服务器这两大“罪魁祸首”,由于它们仅仅只能部署在Windows平台上导致asp.net不能跨平台了。

2.2、asp.net core web服务器HTTP.sys和Kestrel以及特点

HTTP.sys 是仅在 Windows 上运行的适用于 ASP.NET Core 的 Web 服务器。

Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。Kestrel 是 Web 服务器,默认包括在 ASP.NET Core 项目模板中。

Http.sys运行在内核态中,极大减少了系统调用次数,运行效率很高;自带生存环境的安全,鲁棒性等特点;它也可以作为反向代理,因此它的功能更加强大,主要问题是只能运行在windows下。

Kestrel服务器运行在Asp.net core应用程序中,能高效的处理网络请求,且跨平台。

Kestrel应用在生产环境中需要运行在代理服务器后面,以获取安全性,负载均衡等能力。

如果你将你的应用部署在公共网络上,我们建议你使用IIS,Nginx或者Apache作为反向代理服务器。一个反向代理服务器接收来自网络的HTTP请求并且在经过一些初步处理后将请求传递到Kestrel服务器。


HTTP.sys和Kestrel特点对比


2.3、asp.net core两种托管模型以及如何选择

1)、Inprocess(进程内托管)

在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用,称为进程内托管模型。选择进程内托管,意味着将 .NetCore 应用程序的工作进程托管到 IIS 的工作进程 w3wp.exe 中,使用的 IIS 进程内服务器,即使用的是:IISHttpServer。


inprocess(进程内托管)


2)、Outofprocess(进程外托管)

将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用,称为进程外托管模型。选择进程外托管时,web.config 配置节点 system.webServer/aspNetCore.hostingModel 的值必须设置为:outofprocess,选择进程外托管,实际上就是告诉 IIS ,当前应用程序不使用 IISHttpServer,改为使用 Kestrel 服务器。


outofprocess(进程外托管)


阿笨个人对这两种进程托管模型的理解

1、如果net core部署在iis上,我们可以通过AspNetCoreHostingModel来使用进程内模(InProcess)还是进程

外模型(OutOfProcess);进程内托管比进程外托管提供了更好的性能,故默认IIS上推荐使用进程内模型。

2、如果net core部署在linux系统,则AspNetCoreHostingModel只能直接就使用进程外模型。

InProcess时使用 IIS HTTP 服务器 (IISHttpServer) ,OutOfProcess时使用 Kestrel 服务器!

然后Kestrel 服务器有一定的“局限性”,所以在linux上我们推荐用Nginx反向代理方式进行net core的站点部署。

3)、那么问题来了两种托管模型我们该如何进行选择?

答:如果你的net core长期一段时间允许在windows平台上,那么一般推荐使用 “进程内托管” 模式,使用 “进程内托管”可依托 IIS 获得更高的吞吐量!否则的话还是使用 “进程外托管” 。

Kestrel 是 ASP.NET Core 项目模板中默认 Web 服务器.可以结合反向代理服务器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。

asp.net core 系列 18 web服务器实现(重点学习)
https://www.cnblogs.com/MrHSR/p/10324110.html

2.4、ASP.NET Core的运行机制


ASP.NET Core 的运行机制


ASP.NET Core 的运行机制如上图所示, 现在做一下详细说明:

1)、Web Server: ASP.NET Core提供两种服务器可用, 分别是Kestrel和HTTP.sys(Core 1.x 中被命名为 WebListener), 

A. Kestrel是一个跨平台的Web服务器;

B. HTTP.sys只能用在Windows系统中;

2)、Internet: 当需要部署在Internal Network 中并需要 Kestrel 中没有的功能(如 Windows 身份验证)时,可以选择HTTP.sys。

3)、IIS、Apache、Nginx: Kestrel 可以单独使用 ,也可以将其与反向代理服务器(如 IIS、Nginx 或 Apache)结合使用。请求经这些服务器进行初步处理后转发给Kestrel(即图中虚线的可选流程)。

三、ASP.NET Core托管和部署实操演练

3.1、VirtualBox下安装Linux CentOS系统

1)、虚拟机推荐VirtualBox

https://www.virtualbox.org/

2)、VirtualBox下安装CentOS系统(选择DVD ISO)

https://www.centos.org/download/

阿笨个人总结:

1、安装CentOS的时候记得选择勾选【网络连接】,否则安装完成后没有网络,通过命令方式安装很麻烦。

2、学习CentOS时候选择基本环境勾选上【带GUI的服务器】和附件选型勾选上【开发工具】。

参考文章:
虚拟机VirtualBox与CentOS 7安装 
https://www.cnblogs.com/SasaL/p/9844400.html

3)、Linux远程终端工具(SSH)

Windows环境下的Linux终端—SecureCRT下载地址
https://dwz.cn/t63nu6zo

3.2、两种方式安装.NET Core SDK on Linux CentOS 

3.2.1、 离线包tar.gz安装方法

https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.203-linux-arm64-binaries

mkdir -p $HOME/dotnet 

上传dotnet-sdk-2.2.203-linux-x64.tar.gz 文件在$HOME/dotnet 目录中

cd $HOME/dotnet

tar zxf dotnet-sdk-2.2.203-linux-x64.tar.gz -C $HOME/dotnet

export DOTNET_ROOT=$HOME/dotnet 

export PATH=$PATH:$HOME/dotnet

注意当前环境变量设置只影响当前会话终端。所以我们需要创建软链接方式来设置环境变量。方法如下:

1、su切换到root用户。

2、创建软链接执行:ln -s $HOME/dotnet/dotnet /usr/local/bin

3.2. 2、在线rpm安装方式 

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

sudo yum update

sudo yum install dotnet-sdk-2.2 

rpm在线安装方式,会自动创建环境变量。因此如果安装完成输入dotnet --version,显示版本号则代表成功 。

参考文章:

.net core开发工具与SDK

https://www.cnblogs.com/SasaL/p/9851067.html

CentOS 7 下安装.NET Core SDK 2.1

https://ken.io/note/centos7-.netcore2.1-setup

3.3、 Linux CentOS上安装Nginx

Nginx官网:
http://nginx.org/en/download.html

源码安装、yum安装和rpm安装的区别
1、yum安装可以看成是从网络在线安装的一种方式,只需要yum install 软件名,系统就自动根据yum源配置文件中的镜像位置去下载安装包了,并可以自动分析所需的软件依赖关系,自动安装所需的依赖软件包。此方式适合初学者,简单方便,不用考虑依赖关系。但有些软件并不能通过yum来安装。
2、而源码安装方式是需要自己到网上下载源码包,然后解压安装。此方式可以指定配置参数,更加灵活方便,兼容性更强。比较适合对Linux系统有较多了解的进阶用户使用。

3.3.1、通过rpm包方式安装nginx

3.3.2、通过源码tar.gz安装包编译方式安装nginx

mkdir -p $HOME/nginx

上传文件 nginx-1.14.2.tar.gz

 cd $HOME/nginx

tar zxf nginx-1.14.2.tar.gz -C $HOME/nginx

cd $HOME/nginx/nginx-1.14.2

yum install pcre-devel

yum install zlib zlib-devel

yum install openssl openssl-devel

./configure

make && make install

安装完成后,查看nginx的安装目录,执行whereis nginx

cd /usr/local/nginx/sbin

测试nginx是否安装成功    ./nginx -t

可以稍微配置一下,在任何目录下都可以启动nginx,加入到环境变量PATH中

ln -s /usr/local/nginx/sbin/nginx  /usr/local/bin 

现在在任何目录都可运行nginx ,再次运行nginx -t

/usr/local/nginx/conf/nginx.conf 修改配置文件,添加IP。

比如:server {
 listen 80; server_name localhost 192.168.0.6;

启动执行nginx、  停止nginx -s stop

重新加载配置nginx -s reload

虚拟机中访问:http://localhost/   http://192.168.0.6/

firewall-cmd --add-port=80/tcp //开启80端口

firewall-cmd --reload //重新加载配 

主机访问:http://192.168.0.6/

参考文章:

nginx服务器详细安装过程(使用yum 和 源码包两种安装方式,并说明其区别)

https://segmentfault.com/a/1190000007116797


3.4、使用IIS 在 Windows 上托管 ASP.NET Core

使用IIS 在 Windows 上托管 ASP.NET Core

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore-3.0

.NET Core 两种发布部署方式

1)、依赖于Framework框架的发布方式 Framework-dependent deployments (FDD)(默认推荐)

2)、独立提供运行时环境的部署方式 Self-contained deployments (SCD )

需要注意的是Windows Server Hosting现在已经集成在net core 2.2中了,无需再独立进行安装。

3.5、使用Nginx 在 Linux 上托管 ASP.NET Core

1)、使用Nginx 在 Linux 上托管 ASP.NET Core

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.0

Kestrel 非常适合从 ASP.NET Core 提供动态内容。但是,Web 服务功能不像服务器(如 IIS、Apache 或 Nginx)那样功能丰富。反向代理服务器可以卸载 HTTP 服务器的工作负载,如提供静态内容、缓存请求、压缩请求和 HTTPS 终端。

2)、使用 Apache 在 Linux 上托管 ASP.NET Core

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.0

四、课后思考与总结

4.1、思考

我们都知道在Linux系统中标准的做法是通过Nginx作为反向代理来访问我们的ASP.NET Core Web应用程序,上一课程最后阿笨给大家留下了一个问题,就是当我们的Web应用程序如果异常终止或者服务器宕机重启后,那么如何保证我们的程序能够正常进行访问呢?

如果大家感兴趣可以学习一下阿笨手把手教会你如何通过《CentOS7+Nginx+Supervisor部署ASP.NET Core实操手册》课程。

4.2、总结

.NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨平台、开源”却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕。并不是说Windows不适合做软件开发。比如,[Visual Studio]在短期内可能不会有竞争对手。阿笨的观点是,如果你不是必须使用某个非跨平台系统(通常都是指Windows)的话,也许你可以试一下其它环境。尝试新的东西,对强化技术和开拓视野来说总是好的。

最后送大家一句话:希望大家在.NET开发的学习道路上一直跟着阿笨坚持下去吧!

参考文章:

托管和部署 ASP.NET Core

https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/?view=aspnetcore-3.0

ASP.NET Core的Kestrel服务器

https://www.cnblogs.com/Wddpct/p/6123653.html

ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解

https://www.cnblogs.com/vipyoumay/p/7525478.html

Asp.NetCore轻松学-部署到 IIS 进行托管

https://www.cnblogs.com/viter/p/10388902.html

一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

https://www.cnblogs.com/vipyoumay/p/7455431.html