【发布时间】:2019-05-21 18:57:37
【问题描述】:
我在一些 IIS 网络服务器前面有一个 HaProxy 负载平衡器。 Haproxy 检查特定路径上的 iis 应用程序是否已启动或维护。
我想制定一个解决方案,我可以安全地重新启动随机的 IIS 机器,然后让它触发我的 iis 应用程序:
- 对重启做出反应并在特定路径上返回特定响应代码(在本例中为 404)
- 暂停主机重启 15 秒,以确保所有调用均已处理,并且 haproxy 已看到此 404 状态代码,表明 iis 服务器即将重启。
有没有可能做这两件事?
Windows Server 2016、.Net 4.7.2
这不起作用,因为当 IIS 运行 Application_End 代码时,对 IIS 的所有调用都将返回“服务不可用”:
protected void Application_End()
{
var log = SystemLogManager.GetLogger(GetType());
try
{
log.Warn("Ending application. Hanging for 15 seconds...");
Thread.Sleep(TimeSpan.FromSeconds(15));
log.Warn("Done end");
}
catch(Exception ex)
{
log.Error("Unexpected error in application end", ex);
}
}
【问题讨论】:
-
如果系统试图暂时停止它很可能以 IIS 刚刚被内核终止。
-
@Stefan Well haproxy 有一个明确的特性,将 404 解释为“停机维护”。如果我只是让 IIS 在重新启动时返回 503,那么 haproxy 可能仍然会在它意识到服务器永久关闭之前将流量发送到站点(直到重新启动完成)。我使用了与 bdn02 接受的答案相同的 powershell