Win2k8R2 / IIS 7.5 - 用户收到 503 响应,日志中未报告 503 错误

mer*_*erk 5 application-pools 503-error iis-7.5

我有 2 个带有镜像内容的 Web 服务器。他们面前有一个负载平衡器。

从昨天开始,我们一直有人抱怨 503 错误。我在 IIS 日志文件中找不到任何 503 错误。然而,服务器主机说这些错误是由于我们网站中的 .Net 错误导致应用程序池回收。

他们指出了 windows 应用程序事件日志中的几个错误,如下所示:

Log Name:      Application
Source:        ASP.NET 4.0.30319.0
Date:          3/31/2012 8:35:37 PM
Event ID:      1309
Task Category: Web Event
Level:         Warning
Keywords:      Classic
User:          N/A
Computer:      6251.local
Description:
Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 3/31/2012 8:35:37 PM 
Event time (UTC): 4/1/2012 1:35:37 AM 
Event ID: e7a580c7b38545cca3416a8595408f24 
Event sequence: 97 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/2/ROOT-1-129777167518960645 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:\inetpub\wwwroot\mywebsite\ 
    Machine name: 6252 

Process information: 
    Process ID: 20000 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\MyAppPool
Run Code Online (Sandbox Code Playgroud)

特别是他们说进程信息下的帐户名称表明应用程序池正在回收。他们说如果应用程序池不回收,帐户名将是网站文件所在的文件夹。

我检查了应用程序池设置 - 它设置为每 29 小时回收一次。并且快速故障保护设置为默认 5 分钟内出现 5 次故障。但是在这么短的时间内,我还没有在事件日志中看到 5 次失败。

谁能帮我确认 503 响应是否确实是由应用程序池回收生成的?还是这些错误来自其他地方?我当时的猜测是他们的负载平衡器实际上是返回 503 错误的那个。但这只是猜测。

Tri*_*anK 12

您已经提到了“IIS 日志文件”(单数),但始终 需要评估两个日志:

  • 来自网站工作进程的W3SVCnn日志 (C:\Inetpub\Logs),以及
  • 来自 HTTP.SYS 的HTTPERR日志 (C:\Windows\System32\Logfiles\HTTPERR),它将请求路由到工作进程并提供内核模式队列,旨在从工作进程更改(如回收)中缓冲客户端

503 更有可能出现在 HTTPERR 日志中,以及失败的原因,因为它们更有可能反映 HTTP.SYS 与工作进程通信失败(或队列溢出,这相当于类似的事情)。

另请参阅http://support.microsoft.com/kb/820729 - 当文章描述日志记录的作用以及(在底部)可能记录失败的原因时,不确定为什么会有“修复”。

多一点

大多数应用程序框架中有两个队列 - HTTP.SYS 请求队列(在内核模式下)和用户模式请求队列。如果用户模式框架(如 ASP.Net)在内部对请求进行排队,则工作进程的失败将导致其中排队的所有请求的 503(或最多 500),导致 HTTP.SYS 考虑这些请求被遗弃和无法挽救。

如果您的应用程序因未处理的异常而失败,您需要解决这个问题 - IIS 架构无法将 {batches of in-flight requests} 与 {the app午餐本身} 隔离,并且您将收到某种形式的错误传达给客户端 - 回收确保有一个新的工作进程准备好为第二次尝试服务。