间歇性地,IIS7 请求会卡在 WindowsAuthenticationModule 中

间歇性地,IIS7 请求会卡在 WindowsAuthenticationModule 中



我们正在运行一个 IIS7 服务器,其中托管了几十个网站。这些网站中有几个都是我们开发的同一个旧版应用程序的一部分。这些网站都运行相同的代码,并在同一个应用程序池中运行。

在过去几个月中,我们大概每个月都会发现一次,这个应用程序池的所有请求都开始无限期地挂起。当这种情况发生时,我们会收到警报并回收该应用程序池。之后,网站就会重新开始运行。

这只会影响这一个应用程序池 - 永远不会影响同一服务器上的任何其他应用程序池。在回收该池之前,我曾多次查看过工作进程中当前正在执行的请求。它们都显示为在 WindowsAuthenticationModule 内执行。这很奇怪,因为绝大多数应用程序不需要身份验证。有一个小的管理部分使用 Windows 身份验证...但所有其他请求都应该是匿名的。


有人知道这可能是什么原因造成的吗?

这些网站的设置方式有几个不寻常之处。正如我所提到的,它们都运行相同的代码 - 多个网站指向同一个物理目录。唯一的区别是主机头绑定。我不确定为什么不只有一个网站包含所有主机头,但这就是它的工作原理。

在其中几个站点中,相同的物理目录被映射到两个级别 - 作为站点的根目录,并再次作为站点内的应用程序。因此,如果用户转到http://oursite.com/index.aspx,映射到 c:\files\oursite\index.aspx。如果用户转到http://oursite.com/foo/index.aspx,也映射到 c:\files\oursite\index.aspx。我认为有代码可以查看请求 URL 并以不同的方式处理这两个请求。

这很奇怪,因为同一个 web.config 最终被解释为站点配置文件,同时也被解释为站点内的应用程序配置文件。我不知道这是否与身份验证问题有关。


如果找不到原因,我们正在考虑尝试一些解决方法:

  • 将管理部分移至单独的站点,并为客户端提供新的管理 URL。在其自己的应用程序池中运行该单独的站点。然后在所有其他站点共享的 web.config 中,删除 WindowsAuthenticationModule。这样,WindowsAuthenticationModule 中就不会出现挂起的情况。

  • 尝试在经典管道而不是集成管道中运行所有这些站点。它们在我们旧的 IIS6 服务器上运行良好...

  • (如果我们绝望了)设置一个监视网站并当它检测到请求被卡住时自动回收应用程序池的看门狗脚本。


你怎么认为?

谢谢你的帮助,
理查德

答案1

我会尝试右键单击挂起的应用程序池下执行的 w3wp.exe 进程。右键单击它并选择创建转储文件。

任何一个:

  1. 在 Visual Studio 2010 中打开转储文件
  2. 在选项>调试(或类似)下,您可以选择添加符号服务器。添加http://msdl.microsoft.com/download/symbols
  3. 双击挂起的位置,然后在堆栈跟踪中单击鼠标右键并选择下载代码/符号。
  4. 阅读代码并了解挂起的原因

或者:

  1. 跟随本文安装WinDbg
  2. 按照她的做法做,看看你能不能找到问题
  3. 使用 netsh 激活日志记录以查看发生的 kerberos 令牌请求(我还没有在现实生活中尝试过):

    PS C:\> netsh trace show providers | select-string kerberos PS C:\> netsh trace show providers | select-string auth

    ...然后是这样的:

    netsh trace start provider={5BBB6C18-AA45-49B1-A15F-085F7ED0AA90}

或者:

  1. 聘请一名顾问。:)

相关内容