通过同一已发布网域传送 HTTP 和 HTTPS 内容

使用 Cloud CDN 时,通常通过同一主机名传送 HTTP 和 HTTPS 内容。虽然许多浏览器强制要求使用传输层安全协议 (TLS),并禁止传送不安全的内容,但仍然存在必须允许通过同一主机名进行非安全传送和安全传送的使用场景。本文介绍了如何使用 Cloud CDN 来实现此功能。

挑战

当客户端与 CDN 边缘服务器建立连接时,将会协商最终用户递送协议。大多数传统 CDN 平台通过以下方式将流量定向到其各自的递送足迹:

  1. 使用 DNS CNAME 记录指向属于 CDN 的域名。
  2. 将流量路由到支持对相应域名进行 TLS 协商的部分服务器。

由于 Cloud CDN 与 Cloud Load Balancing 集成,因此 Cloud CDN 的方法与传统 CDN 的方法不同。Cloud CDN 利用外部 HTTP(S) 负载平衡器的任播 IP 地址。配置 Cloud CDN 时,您可以将流量定向到某个特定的 IP 地址。这要求在 DNS 记录中构建 A 记录(用于 IPv4)和/或 AAAA 记录(用于 IPv6),而不是构建带有主机名值的 CNAME 记录。

默认情况下,在配置负载平衡器的前端时,Google Cloud 会动态分配一个临时 IP 地址。由于您需要单独配置 HTTP 和 HTTPS 配置,因此这可能会导致您的 Cloud CDN 实例有两个 IP 地址。由于 HTTP 和 HTTPS 使用相同的 A 或 AAAA 记录 IP 地址,因此在 DNS 中无法正确处理这种情况。

解决方案

通过同一主机名传送安全内容和非安全内容时,客户端会被定向到可协商使用 HTTP 或 HTTPS 的边缘服务器。如需使此操作适用于 Cloud CDN,您可以预留 IP 地址,并将预留的 IP 地址绑定到外部 HTTP(S) 负载平衡器中的 HTTP 和 HTTPS 前端配置。

通过同一网域传送 HTTP 和 HTTPS
通过同一网域传送 HTTP 和 HTTPS

在图中:

  • 针对 www.example.com 的传入请求来自使用 HTTP/2、HTTPS 和 HTTP 的客户端。
  • 预留两个 IP 地址:一个用于 IPv4,另一个用于 IPv6:

    • 34.95.111.204
    • [2600:1901:0:b13e::]
  • 这两个 IP 地址都将绑定到 Cloud DNS 中的 www.example.com。

  • 配置外部 HTTP(S) 负载平衡器时,前端配置包括四个使用预留 IP 地址的转发规则:

    名称 协议 IP:端口
    ipv4-http HTTP 34.95.111.204:80
    ipv4-https HTTPS 34.95.111.204:443
    ipv6-http HTTP [2600:1901:0:b13e::]:80
    ipv6-https HTTPS [2600:1901:0:b13e::]:443
  • 对于 Cloud CDN 缓存未命中,负载平衡器会根据负载平衡器的网址映射中定义的设置将请求分发到后端来源。

第 1 步:预留全球外部 IP 地址

创建 IPv4 和/或 IPv6 地址。如需支持 IPv4 和 IPv6 寻址,您必须创建一个 IPv4 地址和一个 IPv6 地址。

在您的 DNS 记录中,创建一条 A(或 AAAA)记录,以将流量定向到此预留的 IP 地址。

控制台

  1. 在 Google Cloud Console 中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 点击预留静态地址以预留 IPv4 地址。
  3. 指定名称 ipv4-address
  4. 将网络层级设置为优质
  5. IP 版本设置为 IPv4
  6. 类型设置为全局
  7. 点击预留

负载平衡器使用在启用 Cloud CDN 时所需的优质层级网络

gcloud

gcloud compute addresses create ipv4-address \
    --ip-version=IPV4 \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

针对 IPv6 重复此步骤。

如需了解详情,请参阅预留新的静态外部 IP 地址

第 2 步:将预留的 IP 地址绑定到负载平衡器

本部分介绍了如何为负载平衡器分配 IP 地址。如何设置负载平衡器的端到端说明不在本文的讨论范围内。如需查看设置示例,请参阅创建 HTTPS 负载平衡器

在前端配置部分,您可以选择在客户端和负载平衡器之间使用的协议。

在此示例中,您将在客户端和负载平衡器之间使用 HTTP 和 HTTPS,因此您需要一个或多个 SSL 证书资源来配置代理。

控制台

配置 HTTP 转发规则

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”页面

  2. 选择您的负载平衡器,然后点击修改
  3. 在左侧面板中,点击前端配置
  4. 名称字段中,输入 ipv4-http
  5. 协议字段中,选择 HTTP
  6. IP 版本设置为 IPv4
  7. IP 地址中,选择您之前创建的 ipv4-address
  8. 确保将端口设置为 80,以允许 HTTP 流量。
  9. 点击完成

配置 HTTPS 转发规则

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”页面

  2. 选择您的负载平衡器,然后点击修改
  3. 在左侧面板中,点击前端配置
  4. 名称字段中,输入 ipv4-https
  5. 协议字段中,选择 HTTPS
  6. IP 版本设置为 IPv4
  7. IP 地址中,选择您之前创建的 ipv4-address
  8. 确保将端口设置为 443,以允许 HTTP 流量。
  9. 点击证书下拉列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从下拉菜单中选择该证书。
    2. 否则,请选择创建新证书
    3. 选择上传我的证书创建 Google 托管的证书
    4. 如果您选择了上传我的证书,请完成以下步骤。
      1. 填写名称 www-ssl-cert
      2. 在相应的字段中上传您的公钥证书(.crt 文件)、证书链(.csr 文件)、私钥(.key 文件)。
      3. 点击创建
    5. 如果您选择创建 Google 托管的证书,请输入网域
    6. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
      1. 点击添加证书
      2. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  10. 点击完成

针对 IPv6 重复上述步骤。

检查并最终确定

  1. 在左侧面板中,点击检查并最终确定
  2. 将您的设置与您之前打算创建的内容进行比较。
  3. 如果看起来都正确,请点击更新

gcloud

  1. 创建目标 HTTP 代理以将请求路由到您的网址映射。

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. 创建目标 HTTPS 代理以将请求路由到您的网址映射。该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,因此您还需要在此步骤中加载证书。

    gcloud compute target-https-proxies create https-lb-proxy \
      --url-map=web-map --ssl-certificates=www-ssl-cert
    
  3. 创建两个全球转发规则(分别用于您创建的两个 IP 地址)以将传入请求路由到相应代理。

    gcloud compute forwarding-rules create ipv4-http \
      --address=ipv4-address \
      --global \
      --target-https-proxy=http-lb-proxy \
      --ports=443
    
    gcloud compute forwarding-rules create ipv4-https \
      --address=ipv4-address  \
      --global \
      --target-https-proxy=https-lb-proxy \
      --ports=443
    

创建全球转发规则后,您的配置可能需要几分钟时间才能传播到全球范围。

第 3 步:在 DNS 区域文件中创建 A 或 AAAA 记录

此流程中的最后一步是在您的 DNS 区域文件中创建 A 和/或 AAAA 记录以指向 Cloud CDN,其中,您的主机名值将根据您在负载平衡器上分配的预留 IP 地址进行响应。

现在,使用 Cloud CDN 时,您可以通过同一主机名传送 HTTP 和 HTTPS。

可选:将 HTTP 重定向到 HTTPS

如果要将 HTTP 请求重定向到 HTTPS 负载平衡器,您必须添加具有前端但没有后端的部分 HTTP 负载平衡器。前端接收请求,然后将其重定向到 HTTPS 负载平衡器。它通过使用以下要素来执行此操作:

  • 具有您的 HTTPS 负载平衡器所使用的预留外部 IP 地址的转发规则(如本页中所示)。
  • 目标 HTTP 代理(如本页面中所示)。
  • 将流量重定向到 HTTPS 负载平衡器的网址映射。

获取支持

如果您对 Google Cloud 和 Cloud CDN 有任何疑问,请联系 Google Cloud 销售团队,或通过 Google Cloud 社区 Slack 频道联系我们,并在 #cloud-cdn 频道中留言。

后续步骤