Asp.Net Core 中的反向代理和进程内 HTTP 服务器
Reverse proxy and in-process HTTP server in Asp.Net Core
我正在阅读 asp.net core app
中的 Kestrel
Web 服务器,特别是 in-process http server
和 reverse proxy
。
作为一个季节性的网络开发者,我很难理解背后的想法:
- 核心应用程序中
in-process http server
实现的相关性?
- 反向代理方法相对于任何典型方法的重要性
web server
?
- 反向代理在 asp.net 核心世界解决的问题类型不是转发
http request
?
- 如果 asp.net 核心应用程序要部署在容器中,
reverse proxy
和 Kestrel
如何关联/通信(1:n
或 1:1
) ?
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 核心应用程序容器的反向代理。
我正在阅读 asp.net core app
中的 Kestrel
Web 服务器,特别是 in-process http server
和 reverse proxy
。
作为一个季节性的网络开发者,我很难理解背后的想法:
- 核心应用程序中
in-process http server
实现的相关性? - 反向代理方法相对于任何典型方法的重要性
web server
? - 反向代理在 asp.net 核心世界解决的问题类型不是转发
http request
? - 如果 asp.net 核心应用程序要部署在容器中,
reverse proxy
和Kestrel
如何关联/通信(1:n
或1:1
) ?
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 核心应用程序容器的反向代理。