问题描述
为App Service配置了健康检查,单独访问Health Check Path的路径,返回代码为200。但为什么在App Service的页面上,一直提示“实例运行不正常”呢?
问题解答
通过查看Health Check Path发送的请求,当使用HTTPS的时候,直接返回200,而当使用HTTP访问时,会先进行307跳转为HTTPS,然后返回200。 而运行状态检测为正常的返回范围为 200 ~ 299。所以,如果返回302就会导致实例状态被判断为不正常。
那为什么Health Check会通过HTTP方式访问而且会发生HTTPS的转换呢?
第一点:这是因为在App Service的配置页面中,设置了HTTPS Only 为Off,也就是说:当前App Service可以通过HTTP的方式访问。
第二点:在应用代码 startup.cs 中启用了中的 app.UseHttpsRedirection();
因为第二点的存在,所以导致了HTTP 向 HTTPS的跳转。 如果能够注释掉 app.UseHttpsRedirection(),第一点就不需要修改。 那如果第二点修改代码不容易,就需要修改第一点【 HTTPS Only设置为On】。
当修改HTTPS Only为On,只允许Health Check发送的请求为HTTPS后,问题解决。运行状态检测结果为正常!
参考资料
使用运行状况检查监视应用服务实例 : https://docs.azure.cn/zh-cn/app-service/monitor-instances-health-check?tabs=python
- 运行状况检查不遵循 302 重定向。
- 每小时最多更换一个实例,每个应用服务计划每天最多更换三个实例。
- 如果运行状况检查的状态为
Waiting for health check response
,则检查可能会由于 HTTP 状态代码 307 而失败,如果已启用 HTTPS 重定向但禁用HTTPS Only
,就可能发生这种情况。
[END]