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