使用重写规则将http重定向到https时,AlwaysOn功能无法正常工作

Fra*_*rds 5 spring tomcat azure azure-web-sites spring-boot

我有一个Azure PaaS实例在Tomcat8容器中运行Spring-Boot打包的"war".问题是,经过一段时间的活动后,"java"进程被终止.

在此输入图像描述

上面的图片是tomcat进程未被杀死时的样子.

只有当我再次向服务器发出任何类型的请求时,tomcat进程才会再次启动.

如果我的理解是正确的,标志'WEBSITE_SCM_ALWAYS_ON_ENABLED'是为了让实例保持活跃,即'w3wp'进程,而不是Tomcat.

解决此问题的一个方法是使用简单的"运行状况"请求"轮询"我的服务器以使其保持活动状态.

如果它的'httpPlatformHandler'有一些Azure配置或Spring-boot配置会更好,这样我就可以防止它进入睡眠状态.

任何帮助表示赞赏.

****更新****

在@DavidEbbo的进一步帮助下,问题被追溯到我从"http"到"https"网址的URL"重写"规则."AlwaysOn"请求在HTTP(端口80)上,因此每当命中Azure请求时,它都会获得重定向(301)作为响应.仍在等待解决方案.

Dav*_*bbo 3

问题的根源在于您用于将 http 重定向到 https 的 URL 重写规则阻止了 AlwaysOn 预热请求到达您的 Java 应用程序。

幸运的是,有一个解决方案。

解决方案#1:使用 XDT 变换

使用以下步骤:

  • 从 web.config 中删除重写规则
  • 相反,使用Kudu 控制台applicationHost.xdt(或 FTP,但这更难)在“site”文件夹(即 )下创建一个名为 file 的文件d:\home\site\applicationHost.xdt。提示:您可以touch applicationHost.xdt在 Kudu Console 中输入来创建一个空文件。
  • 编辑该文件并粘贴“将 http 流量重定向到 https”部分下找到的 XDT 文件。
  • 保存文件并从门户重新启动您的站点。

请注意,AlwaysOn 请求在 http 日志中仍然看起来像 301,但正确的事情仍然会发生(即 Java 将唤醒)。

解决方案#2:直接在 web.config 中进行更改

或者,如果您不想使用 XDT 转换并希望将所有内容保留在 web.config 中,则只需在其中添加缺少的部分即可。具体来说,您需要进行两项更改(与上面的 XDT 匹配):

将此条件添加到您的重写规则中:

<add input="{WARMUP_REQUEST}" pattern="1" negate="true" />
Run Code Online (Sandbox Code Playgroud)

在下面添加此applicationInitialization部分system.webServer

<applicationInitialization>
  <add initializationPage="/" />
</applicationInitialization>
Run Code Online (Sandbox Code Playgroud)

但我建议使用 XDT 方法,因为它不需要棘手的编辑,并且可以将那些“混乱”的东西与代码库分开。

原答案

启用“始终开启”的正确方法是在 Azure 门户中将其设置为“开启”。WEBSITE_SCM_ALWAYS_ON_ENABLED不是您可以设置的内容,而是 Azure 由于启用“始终开启”而设置的内容。

一旦启用“始终在线”,站点的根目录(即/)将每隔几分钟被访问一次,这应该使其保持活动状态。

如果需要命中其他路径,可以使用 applicationInitialization。更多详细信息请参见此处