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

Application Initialization for an App Service in Azure not working

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

我们还观察到发生这种情况的大量 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 被调用 - 这更糟。

我做错了什么?

warm-up 模块使用 HTTP 而不是 HTTPS 发送请求。此行为是设计使然。建议的解决方法将允许从 warm-up 模块向本地主​​机发出 HTTP 请求,但它会将其余请求重定向到 HTTPS,因此这里的设计意味着 warm-up 模块通过 HTTP 发出请求。

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

<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>

以上是我在微软官方文档中看到的。请参考this.

真心希望能帮到你!

我假设您的应用程序运行 ASP.NET 核心。正如另一个答案中提到的,应用程序初始化只支持 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检查。

通过这种方式,您只允许 warmup/healthcheck 路由的 HTTP 请求。无需调整 web.config 或 AppService 设置。