Kestrel:你要知道的AspNetCore跨平台内置Http服务器

- Kestrel 在AspNetcCore中的地位,诞生的初衷

- 针对Kestrel的知识问答, 可能忽略的知识点

AspNetCore 应用程序在一个进程内HTTP服务器中执行,这个服务器侦听HTTP 请求并用封装了一系列request features的HttpContext 面对 Application。

目前这个进程内http 服务器有2个实现:

Kestrel 基于libuv(这个库本身就是跨平台异步I/O)的跨平台HTTP服务器

WebListener 基于 Http.Sys.Kernel 驱动的 window-only HTTP 服务器

Kestrel: 【设计的初衷是为了实现跨平台】

是包含在AspNetCore 新建程序模板中的默认http服务器,如果你的Application只在内网接受请求,你可以:

AspNetCore 被设计在它自己的进程中执行是为了实现跨平台,IIS、Nginx、Apache 有他们自己的启动进程和环境;要是直接使用他们,ASP.NET Core 必须尝试去适配当中每一个,Kestrel 应运而生,使用网络通信解除了对这些web 服务器的差异化依赖,Asp.Net Core 不需要尝试去适配IIS,Nginx,Apache等服务器,相反只需要设置这些web服务器去代理请求到 kestrel。 这样的安排使你不管发布哪里,你的Program.Main 和StartUp 类都基本一样。

如果你的Application 需要暴露给外网,我们推荐使用IIS、Nginx、Apache作为反向代理服务器,代理服务器接受外网HTTP请求,做出初步处理之后将其转向 Kestrel 服务器。

另外一个使用反向代理服务器的最重要原因是 外网发布安全, Kestrel刚诞生还没有足够的防治攻击的能力,这些缺陷包括但不限于 一个合适的timeouts,Size limits,和并发数量。

FAQ:

1. 按照我们通常的做法,一般使用IIS等作为反向代理服务器,请求转发给Kestrel http 服务器,Kestrel是不是没有提供外网访问的能力。

No. 我们始终要明白 Kestrel设计的初衷是为了实现跨平台,但是出生之后遇到的现实问题,是防止攻击的能力还很弱, 所以我们才要搭配这些反向代理服务器, 但是并不是说我们的Kestrel 并不能做到外网访问。

AspNetCore就是这么任性强大, 提供对kestrel的默认配置修改(虽然默认Kestrel 和IIS Express 都只在 本地主机上提供访问):

Set the –urls command line parameter

Use WebHost.UseUrls()

Set up hosting.json

具体coding的方式自己看官方文档, 本文章的目的本身就是为读者构建知识体系, 指出某些隐藏的知识点。

另外由于我们没有使用IIS 等界面化web Server, 我们完成这个事情要按照以下3个步骤:

Change the default URL binding to a non-localhost address

Open the Firewall port

Map a host name to make it easier

还不清楚可以看: https://weblog.west-wind.com/posts/2016/Sep/28/External-Network-Access-to-Kestrel-and-IIS-Express-in-ASPNET-Core#Kestrel:What'stheProblem?UrlBindings

2.AspNetCore使用默认的Kestrel, 是不是就不care IIS Application pool 了?

NO,https://github.com/aspnet/KestrelHttpServer/issues/1040#issuecomment-267506588

If you us Kestrel behind IIS, IIS will manage the process like it always did. It'll restart the process from time to time and that will restart your application (which has kestrel loaded). If you use kestrel by itself then nothing will restart.

这当中我认为是 IIS上的AspNetCore Module 起了 signal 的作用。

相关资料:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/#custom-servers

https://blogs.msdn.microsoft.com/friis/2016/08/25/setup-iis-with-url-rewrite-as-a-reverse-proxy-for-real-world-apps/

http://odetocode.com/blogs/scott/archive/2016/10/25/asp-net-core-and-the-enterprise-part-2-hosting.aspx

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180202G1HCOS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券