为区域级内部应用负载均衡器设置 HTTP 到 HTTPS 重定向

本主题介绍如何使用网址映射重定向将所有内部应用负载均衡器请求从 HTTP 重定向到 HTTPS。本页面上的示例使用已知端口 80(对于 HTTP)和 443(对于 HTTPS)。但是,您不需要使用这些特定的端口号。应用负载均衡器的每个转发规则可以引用 1-65535 中的单个端口

如需配置 HTTP 到 HTTPS 重定向,您必须创建两个负载均衡器,一个用于 HTTPS 流量,另一个用于 HTTP 流量。每个负载均衡器都有自己的转发规则、目标代理和网址映射,但共用同一 IP 地址。对于 HTTP 负载均衡器,您无需配置后端,因为前端会将流量重定向到 HTTPS 负载均衡器的后端。

概括来讲,如需将 HTTP 流量重定向到 HTTPS,您必须执行以下操作:

  1. 创建一个使用预留的共享内部 IP 地址的常规内部 HTTPS 负载均衡器。
  2. 测试负载均衡器,以确保其正常运行。
  3. 将流量重定向到 HTTPS 负载均衡器。

    为此,您必须创建一个仅具有前端的部分内部 HTTPHTTP 负载均衡器。前端会接收请求,然后使用以下资源将其重定向到 HTTPS 负载均衡器:

    • 其预留的内部 IP 地址与第 1 步中创建的 HTTPS 负载均衡器相同的转发规则
    • 目标 HTTP 代理
    • 将流量重定向到 HTTPS 负载均衡器的网址映射

如下图所示,HTTPS 负载均衡器是一个具有预期内部应用负载均衡器组件的常规负载均衡器。

HTTP 负载均衡器具有与 HTTPS 负载均衡器相同的 IP 地址,并且具有网址映射中的重定向指令。

内部 HTTP 到 HTTPS 重定向配置。
内部 HTTP 到 HTTPS 重定向配置(点击可放大)。

创建内部 HTTPS 负载均衡器

如需设置区域级内部应用负载均衡器,请按照设置内部应用负载均衡器中的说明操作。

如果您已有正常运行的区域级内部应用负载均衡器,请确保它的转发规则具有预留的共享 IP 地址,然后继续学习下一部分,即将流量重定向到 HTTPS 负载均衡器

对于跨区域内部应用负载均衡器,请按照设置具有虚拟机实例组后端的跨区域内部应用负载均衡器中的说明创建两个负载均衡器,然后按照将流量重定向到 HTTPS 负载均衡器中的说明操作。

将流量重定向到 HTTPS 负载均衡器

创建一个其 IP 地址与上一步中创建的 HTTPS 负载均衡器相同的部分 HTTP 负载均衡器。该部分负载均衡器会将流量从端口 80 重定向到端口 443

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择内部,然后点击下一步
  5. 跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步
  6. 点击配置

基本配置

  1. 对于负载均衡器的名称,请输入 l7-ilb-http-redirect
  2. 对于区域,请选择 us-west1
  3. 对于网络,请选择 lb-network

配置后端服务

  1. 点击后端配置
  2. 选择后端服务菜单中,选择现有后端服务 l7-ilb-backend-service
  3. 点击确定

配置网址映射

  1. 点击路由规则
  2. 对于模式,选择高级主机和路径规则
  3. 点击添加主机和路径规则
  4. 主机设置为 *

  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. 协议设置为 HTTP
  4. 子网设置为 backend-subnet
  5. 端口设置为 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 负载均衡器的目标代理:

    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. 连接到您的客户端虚拟机。

    gcloud compute ssh l7-ilb-client-us-west1-a \
       --zone=us-west1-a
    
  2. 向端口 80 上的 IP_ADDRESS 发送 HTTP 请求,并预期会出现流量重定向。

    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

后续步骤