為區域性內部應用程式負載平衡器設定 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 負載平衡器與 HTTPS 負載平衡器使用相同的 IP 位址,且網址對應中含有重新導向指令。

內部 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. 在「Cross-region or single region deployment」(跨區域或單一區域部署) 部分,選取「Best for regional workloads」(最適合區域工作負載),然後點選「Next」(下一步)
  6. 按一下 [設定]

基本設定

  1. 在負載平衡器的「Name」(名稱) 中輸入 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. 將「Subnetwork」(子網路) 設為 backend-subnet
  5. 將「Port」(通訊埠) 設為 80
  6. 在「IP address」(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

後續步驟