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 设置。
我们在 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 设置。