我们正在与 Microsoft Azure 支持团队发生争执。我希望 Serverfault 社区能够加入,因为支持团队之前已经把我们搞砸了。
这是正在发生的事情。
作为我们在 Azure 上托管的更大 SaaS 服务的一部分,我们有一个前端应用服务,它接受基本的 HTTP 请求,执行一些小的验证,然后将繁重的工作传递给后端服务器。这个过程不是 CPU、内存或网络密集型的,我们根本不接触磁盘子系统。
定价层是“基本:2 中”,这对于我们施加的负载来说绰绰有余。CPU 和内存图表显示系统在很大程度上处于休眠状态,内存使用率约为 36%。
由于我们在服务器学校非常关注,我们使用 Azure 的标准监控设施积极监控整体解决方案的各个层。我们跟踪的计数器之一是“磁盘队列长度”,它是 Azure 应用服务上为数不多的可用计数器之一,因此它一定很重要。
回到服务器学校时,我们被告知理想情况下磁盘队列长度应为零,如果它持续高于 1,则您需要采取行动(某些 RAID 配置有一些例外)。在过去的几年里,一切都很好,磁盘队列长度在 99% 的时间里为零,在 Microsoft 为系统提供服务时偶尔会飙升到 5。
几个月前,事情开始突然发生变化(所以不是在我们推出更改之后)。磁盘队列警报开始泛滥,平均队列长度在 30 秒内。
我们让它运行几天,看看问题是否会消失(性能不会受到明显影响,至少在当前负载下不会)。由于问题没有消失,我们认为可能是底层系统有问题,因此我们实例化了一个全新的 Azure App Service 并迁移到该服务。同样的问题。
所以我们联系了 Azure 支持。自然地,他们要求我们运行一些无意义的测试,希望我们能离开(他们要求网络跟踪...磁盘队列问题!)。我们不会轻易放弃,所以我们运行了他们的无意义测试,最终被告知只需将队列长度的警报设置为 50(超过 10 分钟)。
虽然我们无法控制底层硬件、基础设施和系统配置,但这听起来并不正确。
他们的完整回复如下
我使用在此案例中收集的信息联系了我们的产品团队。
他们调查了您为磁盘队列长度指定的警报比预期更频繁地触发的问题。
此警报设置为在 5 分钟内磁盘队列长度平均值超过 10 时通知您。此指标是在采样间隔期间排队等待所选磁盘的读取和写入请求的平均数。对于 Azure 应用服务基础结构,此指标在以下文档链接中讨论:https : //docs.microsoft.com/en-us/azure/app-service-web/web-sites-monitor
对于部署的任何类型的应用程序,10 的值都非常低,因此您可能会看到误报。这意味着警报可能会比确切的连接数更频繁地触发。
例如,我们在每个虚拟机上运行反恶意软件服务以保护 Azure 应用服务基础结构。在这些时间里,您将看到已建立的连接,如果警报设置为较低的数字,则可以触发。
我们没有发现任何影响您网站可用性的反恶意软件扫描实例。Microsoft 建议您考虑将磁盘队列长度指标设置为 10 分钟内至少 50 的平均值。
我们相信这个值应该允许您为了性能目的继续监控您的应用程序。它也应该较少受到我们出于维护目的运行的反恶意软件扫描或其他连接的影响。
有人想插话吗?
我们在 Azure 上运行的 Web 应用程序安装了 Azure Let's Encrypt 0.9.6 扩展。启动扩展 ( https://********-website-stage.scm.azurewebsites.net/letsencrypt/
) 没有问题,我们可以使用创建证书所需的值填写表单,如附图所示:
大约 2 分钟后,请求超时。我们得到的错误是:
502 - Web 服务器在充当网关或代理服务器时收到无效响应。
您要查找的页面有问题,无法显示。当 Web 服务器(作为网关或代理)联系上游内容服务器时,它收到来自内容服务器的无效响应。
错误日志是这样说的:
错误报告的 Web 应用程序名称 ( ******-website-stage
) 存在(它用于******-website-stage.azurewebsites.net
),但它看起来有点滑稽 https 前缀,波浪号字符(~1)后面的数字是 1,最后,在 https 上调用端口 80 ?
我们在我们的生产环境中做了完全相同的配置和 letencrypt 安装,它成功了,没有任何问题。
当我们的 Web 应用程序尝试再次联系 Let's Encrypt 以提供有关我们的 Azure Web 应用程序配置的信息(例如,要为其注册证书的主机名)时,似乎会出现此问题。
有什么想法下一步要看吗?
在Azure中创建应用程序服务并选择Docker容器作为应用程序类型时,您在哪里设置环境变量?
我的应用程序是通过以下方式在 Azure 中构建的: 1. 创建资源 > 应用服务 > 发布 > 选择 Docker 映像(而不是代码) 2. 指向 Azure 注册表中的 Docker 容器。
该应用程序构建良好,但我希望在 docker run 命令期间传递环境变量(在其他服务上,您只需设置环境变量)。当应用程序构建时,您可以在日志中看到应用程序服务运行“docker run...”并传入 --env 变量。像这样
“docker run -d -p 56996:80 --name nameofapp_7 -e WEBSITE_SITE_NAME=AngularApp”
我需要知道的是,在 Azure 门户中的哪个位置可以设置要传递到运行命令中的变量。即 WEBSITE_SITE_NAME ?
我的 Azure 网站无法连接到远程系统。
我无法访问远程系统,因此我唯一的选择是从我的 azure 托管环境通过 IP 和端口进行 TELNET。问题是无法访问此环境,因为它直接由 azure 托管,而不是 VM。
是否可以从 Azure 托管的网站 TELNET 到远程站点?