公共负载均衡器允许您在运行已发布应用程序的服务器之间分配流量。
当您添加已发布的应用程序路由到您的 Cloudflare Tunnel 时,Cloudflare 会生成一个以所创建隧道的 UUID 命名的 cfargotunnel.com 子域。您可以使用 <UUID>.cfargotunnel.com 作为端点地址并在端点主机标头中指定应用程序主机名(app.example.com),从而将该应用程序添加到负载均衡器池中。如果服务位于 Cloudflare Tunnel 背后,负载均衡器(Load Balancer)不支持直接将 app.example.com 添加为端点。
- 具有已发布应用程序路由的 Cloudflare Tunnel
要为已发布的 Cloudflare Tunnel 应用程序创建负载均衡器:
-
在 Cloudflare 仪表板中,转到 **Load Balancing(负载均衡)**页面。
Go to Load Balancing ↗ -
选择 Create load balancer(创建负载均衡器),然后选择 Public load balancer(公共负载均衡器)。
-
在 **Select website(选择网站)**下,选择您已发布应用程序路由的域名。
-
在 **Hostname(主机名)**页面上,输入负载均衡器的主机名(例如,
lb.example.com)。 -
在 **Pools(池)**页面上,选择 **Create a pool(创建池)**并输入描述性名称。
-
添加具有以下值的 Tunnel 端点:
- Endpoint Name(端点名称):运行应用程序的服务器名称
- Endpoint Address(端点地址):
<UUID>.cfargotunnel.com(在 [Cloudflare 仪表板](https://dash.cloudflare.com/)中的 **Networking(网络)**> **Tunnels(隧道)** 中查找 Tunnel ID) - Header value(标头值):您已发布应用程序路由的主机名(例如,
app.example.com) - Weight(权重):
1(如果只有一个端点)
-
选择 Fallback pool(回退池)。有关路由选项,请参阅流量分流策略。
-
(推荐)在 **Monitors(监视器)**页面上,向端点附加监视器。对于 HTTP 或 HTTPS 应用程序,请创建一个 HTTPS 监视器:
- Type(类型):HTTPS
- Path(路径):
/ - Port(端口):
443 - Expected Code(s)(预期代码):
200 - Header Name(标头名称):
Host - Value(值):
app.example.com
-
保存并部署负载均衡器。
要进行测试,请使用负载均衡器主机名(lb.example.com)访问您的应用程序。
参阅负载均衡文档以获取有关负载均衡器设置和配置的更多详细信息。
该应用程序将默认采用负载均衡器主机名的 Cloudflare 设置,包括规则、缓存规则和 WAF 规则。您可以在 Cloudflare 仪表板 ↗中更改主机名的设置。
回顾位于 Cloudflare Tunnel 之后的已发布应用程序的常见负载均衡配置。
在此示例中,假设我们有一个 Web 应用程序在两个不同数据中心的服务器上运行。我们希望将该应用程序连接到 Cloudflare,以便用户可以从世界任何地方访问该应用程序。此外,我们希望 Cloudflare 在服务器之间进行负载均衡,以便在主服务器发生故障时,辅助服务器接收所有流量。
graph LR
subgraph LB["公共负载均衡器 <br> app.example.com "]
subgraph P1[池 2]
E1(["**Endpoint(端点):** <UUID_1>.cfargotunnel.com<br> **Host header(主机标头)**: server2.example.com"])
end
subgraph P2[池 1]
E2(["**Endpoint(端点):** <UUID_2>.cfargotunnel.com<br> **Host header(主机标头)**: server1.example.com"])
end
end
R@{ shape: text, label: "app.example.com" }
R--> LB
P1 -- Tunnel 1 --> cf1
P2 -- Tunnel 2 --> cf2
subgraph D2[私有网络]
subgraph r1[区域 eu-west-1]
cf1@{ shape: processes, label: "cloudflared <br> **Route:** server2.example.com" }
S1(["服务器 2<br> 10.0.0.1:80"])
cf1-->S1
end
subgraph r2[区域 us-east-1]
cf2@{ shape: processes, label: "cloudflared <br> **Route:** server1.example.com" }
S3(["服务器 1 <br> 10.0.0.2:80"])
cf2-->S3
end
end
style r1 stroke-dasharray: 5 5
style r2 stroke-dasharray: 5 5
如图所示,典型设置包括:
- 每个数据中心都有一个专用的 Cloudflare Tunnel。
- 每个隧道一个负载均衡器池。负载均衡器主机名设置为面向用户的应用程序主机名(
app.example.com)。 - 每个池一个负载均衡器端点。端点主机标头设置为
cloudflared已发布的应用程序主机名(server1.example.com)。 - 发生
cloudflared主机故障时,每个隧道在其各自的数据中心内至少有两个cloudflared副本。
用户现在可以使用负载均衡器主机名(app.example.com)连接到应用程序。请注意,此配置仅适用于主备故障转移(Active-Passive failover),因为每个池仅支持每个隧道一个端点。
下图展示了如何使用单个负载均衡器将流量引导到私有网络上的两个不同应用程序。
graph LR
subgraph LB["公共负载均衡器 <br> lb.example.com"]
subgraph P1[App 1 的池]
E1(["**Endpoint(端点):** <UUID_1>.cfargotunnel.com<br> **Host header(主机标头)**: app1.example.com"])
E2(["**Endpoint(端点):** <UUID_2>.cfargotunnel.com<br> **Host header(主机标头)**: app1.example.com"])
end
subgraph P2[App 2 的池]
E3(["**Endpoint(端点):** <UUID_1>.cfargotunnel.com<br> **Host header(主机标头)**: app2.example.com"])
E4(["**Endpoint(端点):** <UUID_2>.cfargotunnel.com<br> **Host header(主机标头)**: app2.example.com"])
end
end
R@{ shape: text, label: "app1.example.com <br> app2.example.com" }
R--> LB
E1 -- Tunnel 1 -->cf1
E3 -- Tunnel 1 --> cf1
E2 -- Tunnel 2 --> cf2
E4 -- Tunnel 2 --> cf2
subgraph N[私有网络]
cf2[cloudflared <br> **Route:** app1.example.com <br> **Route:** app2.example.com]
S3(["App 1 <br> 10.0.0.1:80"])
cf2-->S3
cf2-->S1
cf1[cloudflared <br> **Route:** app1.example.com <br> **Route:** app2.example.com]
S1(["App 2 <br> 10.0.0.2:80"])
cf1-->S1
cf1-->S3
end
此负载均衡设置包括:
- 两个具有到两个应用程序的相同路由的 Cloudflare Tunnel。
- 每个应用程序一个负载均衡器池。
- 每个负载均衡器池在每个隧道中都有一个端点。
- 每个应用程序都有一个指向负载均衡器主机名的 DNS 记录。
用户现在可以通过负载均衡器访问所有应用程序。由于每个池有多个隧道端点,此配置支持双活故障转移(Active-Active Failover)。双活(Active-Active)会同时使用池中所有可用的端点来处理请求,通过对流量进行负载均衡来提供更好的性能和可扩展性。
当您通过仪表板配置已发布的应用程序路由时,Cloudflare 将自动生成一个 CNAME DNS record,该记录将应用程序主机名(app1.example.com)指向隧道子域(<UUID>.cfargotunnel.com)。您可以编辑这些 DNS 记录,使其指向负载均衡器主机名。
以下是设置每个负载均衡器多个应用程序之前和之后的 DNS 记录的示例:
之前:
| 类型 | 名称 | 内容 |
|---|---|---|
| CNAME | app1 | <UUID_1>.cfargotunnel.com |
| CNAME | app2 | <UUID_1>.cfargotunnel.com |
| CNAME | app1 | <UUID_2>.cfargotunnel.com |
| CNAME | app2 | <UUID_2>.cfargotunnel.com |
之后:
| 类型 | 名称 | 内容 |
|---|---|---|
| LB | lb.example.com |
不适用 |
| CNAME | app1 | lb.example.com |
| CNAME | app2 | lb.example.com |
Tunnel 端点不支持 TCP 监视器。相反,您应该在 cloudflared 主机上创建健康检查端点,并使用 HTTPS 监视器。例如,您可以使用 cloudflared 返回固定的 HTTP 状态响应:
- 为健康检查添加已发布应用程序路由:
- Hostname(主机名):
health-check.example.com - Service Type(服务类型):HTTP_STATUS
- HTTP Status Code(HTTP 状态码):
200
- Hostname(主机名):
- 按照以下设置创建监视器:
- Type:HTTPS
- Path:
/ - Port:
443 - Expected Code(s)(预期状态码):
200 - Header Name(标头名称):
Host - Value(值):
health-check.example.com
此监视器验证 cloudflared 是否可达。它不会检查上游服务是否正在接受请求。
负载均衡器无法区分同一隧道的副本。如果您在两个独立的主机上运行相同的隧道 UUID,负载均衡器会将这两个主机视为单个端点。要保持客户端与特定主机之间的会话亲和性(session affinity),您需要使用不同的隧道 UUID 将每个主机连接到 Cloudflare。
如果您发现不同位置的端点之间存在流量不均衡,您可能需要调整负载均衡器配置。
Cloudflare 使用 Anycast 路由 ↗将最终用户请求定向到最近的数据中心。cloudflared 更倾向于使用同一数据中心内的连接来提供服务,这可能会影响流量在端点之间的分配方式。
如果您在同一个 Tunnel UUID 上运行 cloudflared 副本,请考虑切换到独立的 Tunnel,以便对流量分流进行更细粒度的控制。