HTTP.sys 如何将请求转发到工作进程

Aum*_*Aum 5 iis iis-7 was http.sys

我想大致了解一下 HTTP.sys 将请求转发到 IIS 7.0 及更高版本中的工作进程的方式。为此,我阅读了http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture 上的帖子。然而,这篇文章中有两点似乎是矛盾的,让我感到困惑。

第 1 点: “超文本传输​​协议栈 (HTTP.sys)”一节中提到的第二个要点如下。

内核模式请求队列。由于内核将请求直接转发到正确的工作进程,因此请求会导致上下文切换的开销较小。如果没有工作进程可用于接受请求,内核模式请求队列将保留该请求,直到工作进程接收它。

根据这一点,我的结论如下: HTTP.sys 绕过 WWW 服务将请求“直接”转发给工作进程。如果没有可用的工作进程,当 WAS 服务启动一个新的工作进程时,HTTP.sys 会将请求放入内核模式请求队列中。这个工作进程然后自己从内核模式队列中获取请求。

第2点: “Windows进程激活服务(WAS)”部分下的进程管理小节如下。

WAS 管理 HTTP 和非 HTTP 请求的应用程序池和工作进程。当协议侦听器接收到客户端请求时,WAS 会确定工作进程是否正在运行。如果应用程序池已经有一个为请求提供服务的工作进程,则侦听器适配器会将请求传递给工作进程进行处理。如果应用程序池中没有工作进程,WAS 将启动一个工作进程,以便侦听器适配器可以将请求传递给它进行处理。

根据这一点,我的结论如下: HTTP.sys 将请求“通过 WWW 服务”转发给工作进程,因为它是侦听器适配器。如果没有可用的工作进程,当 WAS 服务启动一个新的工作进程时,HTTP.sys 会将请求放入内核模式请求队列中。然后来自内核模式队列的请求被 WWW 服务接收并转发到工作进程。

任何人都可以让我知道我的上述两个结论中哪一个是正确的?如果两者都不正确,请告诉我正确的流程。

and*_*mka 1

我认为两者都不正确。我还试图弄清楚确切的工作原理,最后找到了 HTTP Server API,https://learn.microsoft.com/en-us/windows/desktop/http/http-version-2-0-architecture

“HTTP.sys“通过 WWW 服务”将请求转发到工作进程,因为这是侦听器适配器。” 从上面的文档和此处https://learn.microsoft.com/en-us/windows/desktop/http/process-isolation中,您可以看到 HTTP 内核模式 (http.sys) 将请求路由到关联的队列与网址。在 iis mgr 中创建应用程序池时,将配置队列,并且在 IIS mgr 中创建网站并将网站绑定到池时,url 将与队列关联。http.sys 将内容放入队列中。应用程序池进程处理队列中的内容。http.sys 和工作进程之间没有直接交互。

“如果没有可用的工作进程,...”从上面的进程隔离文档来看,这也是不正确的:

创建者或控制器进程:控制器进程可以在有或没有管理权限的情况下运行,以监视运行状况并配置服务。控制器进程通常为服务创建单个服务器会话,并在服务器会话下定义 URL 组。与特定 URL 关联的 URL 组确定哪个请求队列为特定 URL 表示的命名空间提供服务。控制器进程还创建请求队列并启动可以访问请求队列的工作进程。工作进程:工作进程由控制器进程启动,在与其服务的 URL 关联的请求队列上执行 IO。创建请求队列时,ACL 中的控制器进程会授予 Web 应用程序对请求队列的访问权限。除非 Web 应用程序也是创建者进程,否则它不会管理服务或配置请求队列。控制器进程将请求队列的名称传递给工作进程,工作进程通过名称打开请求队列。工作进程可以加载第三方 Web 应用程序,而不会在应用程序的其他部分引入安全漏洞。

因此控制器进程将创建工人。毫无疑问,这就是WAS,具体如何检测何时创建进程尚未定义,但它绝对是上面提到的“控制器进程”。

有趣的是,在 asp.net core 中,您可以在 http.sys、Microsoft.AspNetCore.Server.HttpSys 之上运行应用程序。它在内部使用此 api 来配置事物。https://github.com/aspnet/HttpSysServer/blob/master/src/Microsoft.AspNetCore.Server.HttpSys/NativeInterop/HttpApi.cs

这份文档为我消除了很多困惑。我希望它有帮助。