透過相同的已發布網域傳遞 HTTP 和 HTTPS 內容

使用 Cloud CDN 時,通常會透過相同的主機名稱傳遞 HTTP 和 HTTPS 內容。許多瀏覽器會強制使用傳輸層安全標準 (TLS),並禁止傳送不安全的內容,但仍有些應用情境允許透過相同主機名稱傳遞不安全和安全的內容。本文將探討如何使用 Cloud CDN 達成這項功能。

挑戰

用戶端與 CDN 邊緣伺服器建立連線時,系統會進行使用者傳輸通訊協定的協商。大多數傳統 CDN 平台會透過下列方式,將流量導向各自的傳送範圍:

  1. 使用 DNS CNAME 記錄,指向屬於 CDN 的網域名稱。
  2. 將流量轉送至支援該網域名稱 TLS 交涉的伺服器子集。

Cloud CDN 整合了 Cloud Load Balancing,因此做法與傳統 CDN 不同。Cloud CDN 會運用外部應用程式負載平衡器的 Anycast 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 和 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。

  • 設定外部應用程式負載平衡器時,前端設定會包含四項使用預留 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 控制台的「External IP addresses」(外部 IP 位址) 頁面。

    前往「External IP addresses」(外部 IP 位址) 頁面

  2. 按一下「Reserve static address」(預留靜態位址) 以預留 IPv4 位址。
  3. 將「Name」(名稱) 指派為 ipv4-address
  4. 將「Network tier」(網路級別) 設為「Premium」(進階)。
  5. 將「IP version」(IP 版本) 設為「IPv4」
  6. 將「Type」(類型) 設為「Global」(通用)
  7. 按一下「Reserve」(預留)

負載平衡器會使用進階級網路,這是啟用 Cloud CDN 時的必要條件。

gcloud

gcloud compute addresses create ipv4-address \
    --network-tier=PREMIUM \
    --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 憑證資源才能設定 Proxy。

控制台

設定 HTTP 轉送規則

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 選取負載平衡器,然後按一下「Edit」(編輯)
  3. 點選左側面板中的「Frontend configuration」(前端設定)
  4. 在「Name」(名稱) 欄位中輸入 ipv4-http
  5. 在「Protocol」(通訊協定) 欄位中選取 HTTP
  6. 將「IP version」(IP 版本) 設為 IPv4
  7. 在「IP address」(IP 位址) 部分,選取先前建立的「ipv4-address」。
  8. 確認「Port」(通訊埠) 已設為 80,以允許 HTTP 流量。
  9. 按一下「Done」(完成)

設定 HTTPS 轉送規則

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 選取負載平衡器,然後按一下「Edit」(編輯)
  3. 點選左側面板中的「Frontend configuration」(前端設定)
  4. 在「Name」(名稱) 欄位中輸入 ipv4-https
  5. 在「Protocol」(通訊協定) 欄位中選取 HTTPS
  6. 將「IP version」(IP 版本) 設為 IPv4
  7. 在「IP address」(IP 位址) 部分,選取先前建立的「ipv4-address」。
  8. 確認「Port」(通訊埠) 已設為 443,以允許 HTTP 流量。
  9. 按一下「Certificate」(憑證) 下拉式清單。
    1. 如果已有自行管理的 SSL 憑證資源,且想要做為主要 SSL 憑證使用,請在下拉式選單中選取所需資源。
    2. 否則,請選取 [Create a new certificate] (建立新憑證)
    3. 選取「Upload my certificate」(上傳我的憑證) 或「Create Google managed certificate」(建立 Google 代管的憑證)
    4. 如果選取「Upload my certificate」(上傳我的憑證),請完成下列步驟。
      1. 在「Name」(名稱) 部分填入 www-ssl-cert
      2. 在正確的欄位中上傳「Public key certificate」(公用金鑰憑證) (.crt 檔案)、「Certificate chain」(憑證鏈結) (.csr 檔案) 及「Private key」(私密金鑰) (.key 檔案)。
      3. 按一下 [Create] (建立)。
    5. 如果選擇「Create Google managed certificate」(建立 Google 代管的憑證),請輸入「Domain」(網域)
    6. 如要新增主要 SSL 憑證資源以外的憑證資源,請按照下列步驟操作:
      1. 按一下「Add certificate」(新增憑證)
      2. 從「Certificates」(憑證) 清單中選取所需憑證,或是按一下「Create a new certificate」(建立新憑證) 並按照上方說明操作。
  10. 按一下「Done」(完成)

針對 IPv6 重複執行這些步驟。

檢查並完成

  1. 點選左側面板中的「Review and finalize」(檢查並完成)
  2. 將設定與打算建立的內容進行比較。
  3. 如果沒有任何問題,請按一下「Update」(更新)

gcloud

  1. 建立目標 HTTP Proxy,將要求轉送至網址對應。

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. 建立目標 HTTPS Proxy,將要求轉送至網址對應。Proxy 是負載平衡器的一部分,用於存放 HTTPS 負載平衡的 SSL 憑證,因此也可以在此步驟載入憑證。

    gcloud compute target-https-proxies create https-lb-proxy \
      --url-map=web-map --ssl-certificates=www-ssl-cert
    
  3. 建立兩個全域轉送規則,將傳入的要求轉送至 Proxy,一個用於 IPv4,另一個則用於 IPv6。

    • 如果採用全域外部應用程式負載平衡器,請使用 gcloud CLI 指令搭配 load-balancing-scheme=EXTERNAL_MANAGED。這項設定提供進階流量管理功能
    • 如果採用傳統版應用程式負載平衡器,請使用 load-balancing-scheme=EXTERNAL
    gcloud compute forwarding-rules create ipv4-http \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --address=ipv4-address \
      --global \
      --target-http-proxy=http-lb-proxy \
      --ports=80
    
    gcloud compute forwarding-rules create ipv4-https \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --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 負載平衡器。這項服務需具備以下條件:

取得支援

如對 Google Cloud 和 Cloud CDN 有任何疑問,請與 Google Cloud 銷售團隊聯絡,或透過 Google Cloud社群 Slack 頻道與我們聯絡,並在 #cloud-cdn 頻道中張貼訊息。

後續步驟