為區域性內部應用程式負載平衡器設定 HTTP 至 HTTPS 的重新導向

本主題說明如何使用網址對應重新導向,將所有內部應用程式負載平衡器要求從 HTTP 重新導向至 HTTPS。本頁範例使用知名的通訊埠 80 (HTTP) 和 443 (HTTPS)。不過,您不一定要使用這些特定的通訊埠號碼。應用程式負載平衡器的每個轉送規則都可以參照 1 到 65535 之間的單一通訊埠

如要設定 HTTP 至 HTTPS 的重新導向,您必須建立兩個負載平衡器,一個負責 HTTPS 流量,另一個負責 HTTP 流量。每個負載平衡器都有自己的轉送規則、目標 Proxy 和網址對應,但共用相同的 IP 位址。對於 HTTP 負載平衡器,您不需要設定後端,因為前端會將流量重新導向至 HTTPS 負載平衡器的後端。

整體來說,如要將 HTTP 流量重新導向至 HTTPS,您必須執行下列操作:

  1. 建立使用保留的共用內部 IP 位址的一般內部 HTTPS 負載平衡器。
  2. 測試負載平衡器,確認其運作正常。
  3. 將流量重新導向至 HTTPS 負載平衡器。

    為此,您必須建立僅有前端的部分內部 HTTP 負載平衡器。前端會接收要求,然後使用下列資源將要求重新導向至 HTTPS 負載平衡器:

    • 轉送規則的保留內部 IP 位址,與您在步驟 1 中建立的 HTTPS 負載平衡器相同
    • 目標 HTTP Proxy
    • 將流量重新導向至 HTTPS 負載平衡器的網址對應

如下圖所示,HTTPS 負載平衡器是一般負載平衡器,其中包含預期的內部應用程式負載平衡器元件

HTTP 負載平衡器的 IP 位址與 HTTPS 負載平衡器相同,且在網址對應中提供重新導向指示。

內部 HTTP 至 HTTPS 重新導向設定。
內部 HTTP 至 HTTPS 重新導向設定 (按一下可放大)。

建立內部 HTTPS 負載平衡器

如要設定區域內部應用程式負載平衡器,請按照「設定內部應用程式負載平衡器」一文中的說明操作。

如果您已擁有運作中的區域內部應用程式負載平衡器,請確認該負載平衡器有專屬的共用 IP 位址,用於轉送規則,然後繼續閱讀下一節「將流量重新導向至 HTTPS 負載平衡器」。

如果是跨區域內部應用程式負載平衡器,請按照「使用 VM 執行個體群組後端設定跨區域內部應用程式負載平衡器」一文的說明建立兩個負載平衡器,然後按照「將流量重新導向至 HTTPS 負載平衡器」一文的說明操作。

將流量重新導向至 HTTPS 負載平衡器

建立部分 HTTP 負載平衡器,其 IP 位址與先前步驟中建立的 HTTPS 負載平衡器相同。部分負載平衡器會將流量從通訊埠 80 重新導向至通訊埠 443

主控台

開始設定

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

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

  2. 點選「建立負載平衡器」
  3. 在「Type of load balancer」(負載平衡器類型)部分,選取「Application Load Balancer (HTTP/HTTPS)」(應用程式負載平衡器 (HTTP/HTTPS)),然後點選「Next」(下一步)
  4. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  5. 在「跨區域或單一區域部署」部分,選取「最適合區域工作負載」,然後點選「Next」
  6. 按一下 [設定]

基本設定

  1. 在負載平衡器的名稱中輸入 l7-ilb-http-redirect
  2. 在「Region」(區域) 中選取 us-west1
  3. 在「Network」(網路) 中選取 lb-network

設定後端服務

  1. 按一下「後端設定」
  2. 在「Select backend services」選單中,選取現有的後端服務 l7-ilb-backend-service
  3. 按一下「確定」

設定網址對應

  1. 按一下「轉送規則」
  2. 針對「Mode」,請選取「Advanced host and path rule」
  3. 按一下 [Add host and path rule] (新增主機與路徑規則)
  4. 將「Hosts」設為 *

  5. 在「路徑比對器 (比對項目、動作和服務)」部分,輸入以下程式碼:

    name: matcher1
    defaultUrlRedirect:
      httpsRedirect: true
      hostRedirect: IP_ADDRESS:443
      redirectResponseCode: PERMANENT_REDIRECT

  6. 確保 l7-ilb-backend-service 是任何不相符主機和路徑的唯一後端服務。

如要瞭解流量管理,請參閱「為內部應用程式負載平衡器設定流量管理」。

設定 HTTP 適用的前端

  1. 按一下「前端設定」
  2. 將轉送規則的名稱設為 l7-ilb-forwarding-rule
  3. 將「Protocol」(通訊協定) 設為 HTTP
  4. 將「子網路」設為 backend-subnet
  5. 將「Port」(通訊埠) 設為 80
  6. 在「IP 位址」選單中,選取為 HTTPS 負載平衡器轉送規則保留的共用 IP 位址。
  7. 按一下 [完成]

檢閱設定

  1. 按一下「檢查並完成」
  2. 查看負載平衡器設定。
  3. 選用:按一下「等效程式碼」,查看用來建立負載平衡器的 REST API 要求。
  4. 按一下 [建立]。

gcloud

  1. 建立網址對應,方法是建立含有流量重新導向設定的 YAML 檔案。將 IP_ADDRESS 替換為為 HTTPS 負載平衡器轉送規則預留的共用 IP 位址。

    defaultService: regions/us-west1/backendServices/l7-ilb-backend-service
    kind: compute#urlMap
    name: l7-ilb-redirect-url-map
    hostRules:
    - hosts:
     - '*'
     pathMatcher: matcher1
    pathMatchers:
    - name: matcher1
     defaultUrlRedirect:
           hostRedirect: IP_ADDRESS:443
           redirectResponseCode: PERMANENT_REDIRECT
           httpsRedirect: True
  2. 將 YAML 檔案匯入新網址對應:

    gcloud compute url-maps import l7-ilb-redirect-url-map \
       --source=/tmp/url_map.yaml \
       --region=us-west1
    
  3. 建立 HTTP 負載平衡器的目標 Proxy:

    gcloud compute target-http-proxies create l7-ilb-http-proxy \
       --url-map=l7-ilb-redirect-url-map \
       --region=us-west1
    
  4. 建立新的轉送規則和共用 IP 位址:

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --address=IP_ADDRESS \
       --ports=80 \
       --region=us-west1 \
       --target-http-proxy=l7-ilb-http-proxy \
       --target-http-proxy-region=us-west1
    

測試流量重新導向

  1. 連線至用戶端 VM。

    gcloud compute ssh l7-ilb-client-us-west1-a \
       --zone=us-west1-a
    
  2. 將 HTTP 要求傳送至連接埠 80 上的 IP_ADDRESS,並預期流量會重新導向。

    curl -L -k IP_ADDRESS
  3. 查看輸出內容範例。

    Page served from: l7-ilb-backend-w11t
    

    新增 -vvv 即可查看更多詳細資料。

    curl -L -k IP_ADDRESS -vvv
    

    • Rebuilt URL to: IP_ADDRESS/
    • Trying IP_ADDRESS...
    • TCP_NODELAY set
    • Connected to IP_ADDRESS (IP_ADDRESS) port 80 (#0) > GET / HTTP/1.1 > Host: IP_ADDRESS > User-Agent: curl/7.52.1 > Accept: / > < HTTP/1.1 308 Permanent Redirect < location: https://IP_ADDRESS:443/ < date: Fri, 07 Aug 2020 05:07:18 GMT < via: 1.1 google < content-length: 0 <
    • Curl_http_done: called premature == 0
    • Connection #0 to host IP_ADDRESS left intact
    • Issue another request to this URL: 'https://IP_ADDRESS:443/'
    • Trying IP_ADDRESS...
    • TCP_NODELAY set
    • Connected to IP_ADDRESS (IP_ADDRESS) port 443 (#1)
    • ALPN, offering h2
    • ALPN, offering http/1.1
    • Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    • successfully set certificate verify locations:
    • CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs ... ...
    • SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    • ALPN, server accepted to use h2
    • Server certificate:
    • subject: O=Google TESTING; CN=test_cert_1
    • start date: Jan 1 00:00:00 2015 GMT
    • expire date: Jan 1 00:00:00 2025 GMT
    • issuer: O=Google TESTING; CN=Intermediate CA
    • SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
    • Using HTTP2, server supports multi-use
    • Connection state changed (HTTP/2 confirmed)
    • Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
    • Using Stream ID: 1 (easy handle 0x561a6b0e3ea0) > GET / HTTP/1.1 > Host: IP_ADDRESS > User-Agent: curl/7.52.1 > Accept: / >
    • Connection state changed (MAX_CONCURRENT_STREAMS updated)! < HTTP/2 200 < date: Fri, 07 Aug 2020 05:07:18 GMT < server: Apache/2.4.25 (Debian) < last-modified: Thu, 06 Aug 2020 13:30:21 GMT < etag: "2c-5ac357d7a47ec" < accept-ranges: bytes < content-length: 44 < content-type: text/html < via: 1.1 google < Page served from: l7-ilb-backend-https-w11t
    • Curl_http_done: called premature == 0
    • Connection #1 to host IP_ADDRESS left intact

後續步驟