Asp.Net Core 中的反向代理和进程内 HTTP 服务器

Reverse proxy and in-process HTTP server in Asp.Net Core

我正在阅读 asp.net core app 中的 Kestrel Web 服务器,特别是 in-process http serverreverse proxy

作为一个季节性的网络开发者,我很难理解背后的想法:

根据official documentation

ASP.NET Core was designed to run in its own process so that it can behave consistently across platforms. IIS, Nginx, and Apache dictate their own startup process and environment; to use them directly, ASP.NET Core would have to adapt to the needs of each one. Using a web server implementation such as Kestrel gives ASP.NET Core control over the startup process and environment. So rather than trying to adapt ASP.NET Core to IIS, Nginx, or Apache, you just set up those web servers to proxy requests to Kestrel. This arrangement allows your Program.Main and Startup classes to be essentially the same no matter where you deploy.

除此之外,拥有进程内 HTTP 服务器让开发人员的工作变得更加轻松。他们只需下载框架,安装它,无论他们使用什么 OS(Windows、Linux 或 MacOS)或什么 Web 服务器,它都可以开箱即用他们想稍后使用。他们只是触发 dotnet run 命令,该命令启动带有托管网络应用程序的 http 服务器。

虽然可以在开发环境中 运行 当应用程序准备好用于生产时,开发人员应该记住安全性。 Kestrel Web 服务器是非常新的 Web 服务器,因此它不具备 IIS、Apache 或 Nginx 在其长期使用过程中获得的所有安全性和其他有用功能。这是 MS 推荐在生产环境中使用反向代理的唯一原因。反向代理的目标不仅是将请求转发到进程内的 http 服务器,还负责安全、压缩和其他好的 Web 服务器可能提供的功能。

至于容器部署,这实际上取决于您想要实现的目标。有不同的场景:

  • 运行 ASP.NET 核心应用和反向代理在同一个容器中。在这种情况下,ASP.NET 核心应用程序通常在本地端口上配置为 运行,例如5000,而反向代理绑定到端口 80。通常不推荐这种方法,因为最佳实践说 "Each container should have only one concern"
  • 运行 2 个不同容器中的反向代理和 ASP.NET 核心应用程序。在这种情况下,您必须 link 这些容器相互连接,以便将请求从反向代理转发到 Web 应用程序。
  • 运行 一个容器上的反向代理并将其配置为多个 ASP.NET 核心应用程序容器的反向代理。