使用重写规则将 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.
我有一个 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.