透過相同的已發布網域傳遞 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 控制台中,前往「外部 IP 位址」頁面。

    前往「外部 IP 位址」頁面

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

負載平衡器會使用進階級網路,這是啟用 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」(負載平衡) 頁面。

    前往「負載平衡」頁面

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

設定 HTTPS 轉送規則

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

    前往「負載平衡」頁面

  2. 選取負載平衡器,然後按一下「Edit」
  3. 按一下左側面板中的「前端設定」
  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. 填入 www-ssl-cert 的「名稱」
      2. 在正確的欄位中上傳您的公用金鑰憑證 (.crt 檔案)、憑證鏈結 (.csr 檔案) 與私密金鑰 (.key 檔案)。
      3. 按一下 [Create] (建立)。
    5. 如果您選擇 [Create Google managed certificate] (建立 Google 代管憑證),請輸入網域
    6. 如要新增主要安全資料傳輸層 (SSL) 憑證資源以外的憑證資源,請按照下列指示操作:
      1. 按一下「新增憑證」
      2. 從「Certificates」清單中選取所需憑證,或是按一下「Create a new certificate」並按照上述指示操作。
  10. 按一下 [完成]

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

檢查並完成

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

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 頻道中發布備註。

後續步驟