iis - Azure 中应用服务的应用程序初始化不起作用

我们在 Azure 中有一个 appservice 配置为最多 8 个实例,每次部署时,我们都会在可用性和性能(诊断)下看到重启活动。

我们还观察到这种情况发生的大量 5xx 错误。到目前为止,我们的分析是请求被路由到刚刚启动的冷实例,这些都是失败的原因。

我找到了本指南 -> https://azure.github.io/AppService/2020/05/15/Robust-Apps-for-the-cloud.html 并遵循应用程序初始化建议。

结果,我添加了

<applicationInitialization >
  <add initializationPage="/healthcheck"/>
</applicationInitialization>

到 web.config

我重新启动了应用服务并向应用发送了一些测试请求。在 Application Insights 中,我可以看到正在调用运行状况端点 - 因此应用程序初始化逻辑正在启动。但是,它正在调用 http://localhost/healthcheck 并返回 307。

我查看了 307 及其原因,它返回 307,因为应用服务配置为仅使用 https 协议运行,但 http://localhost 不是 https,因此服务正在重定向。

我需要做什么才能使用 https 协议调用应用程序服务。

我尝试在应用程序初始化块中添加完整的应用程序 url,但我可以看到

http://localhost/https://app-service-name.azurewebsites.net/healthcheck 被调用 - 这更糟糕。

我究竟做错了什么?

回答1

预热模块使用 HTTP 而不是 HTTPS 发送请求。此行为是设计使然。建议的解决方法将允许从预热模块到 localhost 的 HTTP 请求,但对于其余请求,它将重定向到 HTTPS,因此这里的设计意味着预热模块通过 HTTP 发出请求。

要解决此限制,您可以考虑启用 HTTP(取消选中 IIS Manager > SSL 设置下的 Require SSL 设置)并使用 URL 重写规则将 HTTP 请求重定向到 HTTPS,但来自暖的请求除外向上模块:

<rewrite>
    <rules>
        <rule name="No redirect on warmup request (request from localhost with warmup user agent)"
        stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{HTTP_HOST}" pattern="localhost" />
                <add input="{HTTP_USER_AGENT}" pattern="Initialization" />
            </conditions>
            <action type="Rewrite" url="{URL}" />
        </rule>
        <rule name="HTTP to HTTPS redirect for all requests" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{HTTPS}" pattern="off" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
    </rules>
</rewrite>

以上是我在微软官方文档中看到的。请参考https://docs.microsoft.com/en-us/troubleshoot/developer/webapps/aspnet/site-behavior-performance/application-fail-ssl-web

真心希望能帮到你!

回答2

我假设您的应用程序运行 ASP.NET Core。如另一个答案中所述,应用程序初始化仅支持 HTTP,因此您需要使其工作。我们所做的是这样的:

/// </summary>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    // IIS App initialization requires HTTP
    app.UseWhen(
        context => !WarmupController.IsWarmupRoute(context.Request.Path),
        mainApp => mainApp.UseHttpsRedirection()
    );

WarmupController.IsWarmupRoute 基本上只包含一个 StartsWith 检查。

这样,您只允许对您的预热/健康检查路由进行 HTTP 请求。无需调整 web.config 或 AppService 设置。