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

AlwaysOn feature does not work correctly when using a rewrite rule to redirect http to https

我有一个 Azure PaaS 实例 运行 Spring-Boot 打包 'war' 在 Tomcat8 容器中。问题是,在-activity一段时间后,'java'进程被杀死。

上图是 tomcat 进程未被杀死时的样子。

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

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

这个问题的一个解决方案是 'poll' 我的服务器用一个简单的 'health' 请求来保持它的活动。

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

感谢任何帮助。

**** 更新 ****

在@DavidEbbo 的进一步帮助下,问题被追溯到 URL 'rewrite' 规则,该规则用于从 'http' 到 'https' url。 'AlwaysOn' 请求在 HTTP(端口 80)上,因此无论何时命中 Azure 请求,它都会获得重定向 (301) 作为回应。还在等待解决方案。

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

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

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

使用以下步骤:

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

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

解决方案 #2:直接在 web.config

中进行更改

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

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

<add input="{WARMUP_REQUEST}" pattern="1" negate="true" />

system.webServer 下添加此 applicationInitialization 部分:

<applicationInitialization>
  <add initializationPage="/" />
</applicationInitialization>

但我建议使用 XDT 方法,因为它不需要棘手的编辑,并且将那些 'messy' 内容与您的代码库分开。

原回答

启用 Always On 的正确方法是在 Azure 门户中将其设置为开启。 WEBSITE_SCM_ALWAYS_ON_ENABLED 不是您可以设置的内容,而是 Azure 启用 Always On 后设置的内容。

启用 Always On 后,您网站的根目录(即 /)每隔几分钟就会被访问一次,这应该会使其保持活动状态。

如果你需要命中额外的路径,你可以使用applicationInitialization。更多详情 here.