带有负载均衡器探测的 Azure 云服务(经典)Web 角色似乎不适用于 HTTPS
Azure Cloud Service (classic) web role with load balancer probe doesn't seem to work for HTTPS
我正在尝试更改旧的经典云服务以使用 HTTP 运行状况探测而不是默认的基于进程的检查。我们遇到了一些实例停止工作但它认为它们仍然可用的问题,因为它们 运行,但无法响应请求。
我们的网站只有 HTTPS,我们甚至没有定义 HTTP 端点。或者没有。负载均衡器不支持 HTTPS,因此我必须添加一个 HTTP 端点并将其配置为使用。这很糟糕,但似乎有效。但是,HTTPS 站点似乎并未包含在 HTTP 端点的运行状况检查中。
如果我通过 HTTP 查询我的健康探测路径,我可以看到它正在 returning 一个 503,如果所有实例 return 一个 503 我可以看到端点无法加载,直到我再做一个 return 200。一旦我再次将 one return 设为 200,它就可以工作了。如果可能,我的请求会被路由到适当的节点。
但是,HTTPS 请求似乎总是发送到同一个实例,而与探测无关。将该实例从 200 翻转到 503 不会导致这些请求转到另一个实例,就像它对 HTTP 所做的那样。根本不平衡。
很难找到有用的文档或示例来说明应该如何设置它或者它是否可以工作。下面是我的 csdef
文件。是否有可能使其正常工作(HTTPS 检查或影响 HTTPS 端点的 HTTP 检查)?
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<LoadBalancerProbes>
<LoadBalancerProbe name="health" protocol="http" port="80" path="health" intervalInSeconds="5" timeoutInSeconds="11"></LoadBalancerProbe>
</LoadBalancerProbes>
<WebRole name="..." vmsize="Standard_D2_v3">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="LoadBalancerEndpointBinding" endpointName="LoadBalancerEndpoint" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="https" port="443" certificate="..." />
<InputEndpoint name="LoadBalancerEndpoint" protocol="http" port="80" loadBalancerProbe="health" />
</Endpoints>
<ConfigurationSettings>
<!-- ... -->
</ConfigurationSettings>
<Certificates>
<!-- ... -->
</Certificates>
</WebRole>
</ServiceDefinition>
我的答案是将 loadBalancerProbe
属性添加到两个端点元素。我还必须确保我正在测试的服务为每个请求建立了新连接,否则它们将始终转到同一个实例(例如 HttpClient
每个实例内部池连接)。这实际上是新的工作配置文件:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<LoadBalancerProbes>
<LoadBalancerProbe name="health" protocol="http" port="80" path="health" intervalInSeconds="5" timeoutInSeconds="11"></LoadBalancerProbe>
</LoadBalancerProbes>
<WebRole name="..." vmsize="Standard_D2_v3">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="LoadBalancerEndpointBinding" endpointName="LoadBalancerEndpoint" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="https" port="443" certificate="..." loadBalancerProbe="health" />
<InputEndpoint name="LoadBalancerEndpoint" protocol="http" port="80" loadBalancerProbe="health" />
</Endpoints>
<ConfigurationSettings>
<!-- ... -->
</ConfigurationSettings>
<Certificates>
<!-- ... -->
</Certificates>
</WebRole>
</ServiceDefinition>
我正在尝试更改旧的经典云服务以使用 HTTP 运行状况探测而不是默认的基于进程的检查。我们遇到了一些实例停止工作但它认为它们仍然可用的问题,因为它们 运行,但无法响应请求。
我们的网站只有 HTTPS,我们甚至没有定义 HTTP 端点。或者没有。负载均衡器不支持 HTTPS,因此我必须添加一个 HTTP 端点并将其配置为使用。这很糟糕,但似乎有效。但是,HTTPS 站点似乎并未包含在 HTTP 端点的运行状况检查中。
如果我通过 HTTP 查询我的健康探测路径,我可以看到它正在 returning 一个 503,如果所有实例 return 一个 503 我可以看到端点无法加载,直到我再做一个 return 200。一旦我再次将 one return 设为 200,它就可以工作了。如果可能,我的请求会被路由到适当的节点。
但是,HTTPS 请求似乎总是发送到同一个实例,而与探测无关。将该实例从 200 翻转到 503 不会导致这些请求转到另一个实例,就像它对 HTTP 所做的那样。根本不平衡。
很难找到有用的文档或示例来说明应该如何设置它或者它是否可以工作。下面是我的 csdef
文件。是否有可能使其正常工作(HTTPS 检查或影响 HTTPS 端点的 HTTP 检查)?
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<LoadBalancerProbes>
<LoadBalancerProbe name="health" protocol="http" port="80" path="health" intervalInSeconds="5" timeoutInSeconds="11"></LoadBalancerProbe>
</LoadBalancerProbes>
<WebRole name="..." vmsize="Standard_D2_v3">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="LoadBalancerEndpointBinding" endpointName="LoadBalancerEndpoint" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="https" port="443" certificate="..." />
<InputEndpoint name="LoadBalancerEndpoint" protocol="http" port="80" loadBalancerProbe="health" />
</Endpoints>
<ConfigurationSettings>
<!-- ... -->
</ConfigurationSettings>
<Certificates>
<!-- ... -->
</Certificates>
</WebRole>
</ServiceDefinition>
我的答案是将 loadBalancerProbe
属性添加到两个端点元素。我还必须确保我正在测试的服务为每个请求建立了新连接,否则它们将始终转到同一个实例(例如 HttpClient
每个实例内部池连接)。这实际上是新的工作配置文件:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="..." xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<LoadBalancerProbes>
<LoadBalancerProbe name="health" protocol="http" port="80" path="health" intervalInSeconds="5" timeoutInSeconds="11"></LoadBalancerProbe>
</LoadBalancerProbes>
<WebRole name="..." vmsize="Standard_D2_v3">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="LoadBalancerEndpointBinding" endpointName="LoadBalancerEndpoint" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="https" port="443" certificate="..." loadBalancerProbe="health" />
<InputEndpoint name="LoadBalancerEndpoint" protocol="http" port="80" loadBalancerProbe="health" />
</Endpoints>
<ConfigurationSettings>
<!-- ... -->
</ConfigurationSettings>
<Certificates>
<!-- ... -->
</Certificates>
</WebRole>
</ServiceDefinition>