5

我想大致了解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服务将请求“直接”转发给工作进程。如果没有可用的工作进程,HTTP.sys 在内核模式请求队列中排队请求,同时 WAS 服务启动一个新的工作进程。然后,该工作进程自行从内核模式队列中获取请求。

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

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

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

谁能告诉我以上两个结论中哪一个是正确的?如果两者都不正确,请告诉我正确的流程。

4

1 回答 1

1

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

“HTTP.sys 将请求“通过 WWW 服务”转发到工作进程,因为那是侦听器适配器。” 从上面的文档和这里https://docs.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

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

于 2018-09-04T06:11:59.270 回答