本示例演示了如何将所有请求从端口 80 重定向到端口 443。
概括来讲,如需将 HTTP 流量重定向到 HTTPS,您必须执行以下操作:
- 创建 HTTPS LB1(此处称为
web-map-https
)。 - 测试 LB1。
- 创建与 LB1 使用同一 IP 地址并且在网址映射中配置了重定向的 HTTP LB2(没有后端)(此处称为
web-map-http
)。 - 测试重定向。
如下图所示,LB1 是一个包含预期负载平衡器组件的常规 HTTPS 负载平衡器。
LB2 是一个与 LB1 使用同一 IP 地址、在网址映射中配置了重定向指令且没有后端的 HTTP 负载平衡器。
如需了解如何为内部负载平衡设置 HTTP 到 HTTPS 重定向,请参阅为内部 HTTP(S) 负载平衡器设置 HTTP 到 HTTPS 重定向。
设置基本的 HTTPS 负载平衡器 (LB1)
本示例逐步介绍如何设置和测试 HTTPS 负载平衡器。
本设置指南介绍如何创建一个已启用 Cloud CDN 的简单外部 HTTPS 负载平衡器。负载平衡器具有以下资源:- 默认 Virtual Private Cloud (VPC) 网络
- Compute Engine 代管实例组
- 已命名端口,用于为后端流量指定端口 80
- 默认网址映射
- 简单的后端运行状况检查
- 简单的前端转发规则
- 预留的外部 IP 地址
- SSL 证书
如需查看包含 IPv6 和 SSL 证书设置的基于内容的多区域示例,请参阅设置基于内容的多区域外部 HTTPS 负载平衡器。
如需了解一般概念,请参阅外部 HTTP(S) 负载平衡概览。
如果您使用的是 GKE,则通常由 Kubernetes Ingress 控制器配置负载平衡器。如需了解详情,请参阅配置 Ingress 以进行外部负载平衡。
HTTPS 负载平衡器拓扑
在本指南中,您将创建下图所示的配置。
图中的事件顺序如下所示:
- 客户端将内容请求发送到转发规则中定义的外部 IPv4 地址。
- 负载平衡器检查是否可以从缓存传送请求。如果可以,负载平衡器会将请求的内容从缓存中传送出去。否则,继续进行处理。
- 转发规则将请求定向到目标 HTTPS 代理。
- 目标代理使用网址映射中的规则确定单个后端服务接收所有请求。
- 负载平衡器确定后端服务只有一个实例组,并将请求定向到该组中的虚拟机实例。
- 该虚拟机提供用户请求的内容。
准备工作
确保您的设置符合前提条件。
设置 SSL 证书资源
按照以下说明创建 SSL 证书资源:
我们建议您使用 Google 管理的证书。
此示例假设您已有一个名为 www-ssl-cert
的 SSL 证书资源。
设置权限
为完成本指南中的步骤,您必须拥有在项目中创建 Compute Engine 实例、防火墙规则和预留 IP 地址的权限。您必须具有 Project Owner 或 Project Editor 角色,或者必须具有以下 Compute Engine IAM 角色。
任务 | 所需角色 |
---|---|
创建实例 | Instance Admin |
添加和移除防火墙规则 | Security Admin |
创建负载平衡器组件 | Network Admin |
创建项目(可选) | Project Creator |
如需了解详情,请参阅以下指南:
创建代管实例组
如需使用 Compute Engine 后端设置负载平衡器,您的虚拟机必须属于某个实例组。本指南介绍了如何创建由一组运行有 Apache 的 Linux 虚拟机组成的代管实例组,然后设置负载平衡。
这个代管实例组提供运行外部 HTTPS 负载平衡器的后端服务器的虚拟机。出于演示目的,后端都会传送其各自的主机名。控制台
- 在 Google Cloud Console 中,转到实例组页面。
- 点击创建实例组。
- 在左侧选择新建代管实例组。
- 对于名称,输入
lb-backend-example
。 - 在位置下方,选择单个区域。
- 对于地区,选择您的首选地区。本示例使用
us-east1
。 - 对于区域,选择 us-east1-b。
- 在实例模板下,选择创建新的实例模板。
- 对于名称,输入
lb-backend-template
。 - 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 9 (stretch)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。 在管理、安全、磁盘、网络、单独租用下的管理标签页上,将以下脚本插入到启动脚本字段。
#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html
在网络标签页上,添加网络标记
allow-health-check
。点击保存并继续。
在自动扩缩模式下,选择不自动调节。
在实例数下,输入
2
。如需创建新的实例组,请点击创建。
gcloud
创建模板。
gcloud compute instance-templates create lb-backend-template \ --region=us-east1 \ --network=default \ --subnet=default \ --tags=allow-health-check \ --image-family=debian-9 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
基于模板创建代管实例组。
gcloud compute instance-groups managed create lb-backend-example \ --template=lb-backend-template --size=2 --zone=us-east1-b
向实例组添加已命名端口
对于您的实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。配置完成后,负载平衡服务会将流量转发到已命名的端口。
控制台
- 在 Google Cloud Console 中,转到实例组页面。
- 点击实例组的名称(在此示例中为
lb-backend-example
),然后点击修改组。 - 点击指定端口名称映射。
- 点击添加项目。
- 对于端口名称,请输入
http
。对于端口号,请输入80
。 - 点击保存。
gcloud
使用 gcloud compute instance-groups
set-named-ports
命令。
gcloud compute instance-groups set-named-ports lb-backend-example \ --named-ports http:80 \ --zone us-east1-b
配置防火墙规则
在此示例中,您将创建 fw-allow-health-check
防火墙规则。这是一种入站流量规则,允许来自 Google Cloud 运行状况检查系统(130.211.0.0/22
和 35.191.0.0/16
)的流量。此示例使用目标标记 allow-health-check
来标识虚拟机。
控制台
- 在 Google Cloud Console 中,转到防火墙页面。
- 点击创建防火墙规则以创建第二条防火墙规则。
- 对于名称,输入
fw-allow-health-check
。 - 在网络下,选择默认。
- 在目标下,选择指定的目标标记。
- 使用
allow-health-check
填充目标标记字段。 - 将来源过滤条件设置为 IP 地址范围。
- 将来源 IP 地址范围设置为
130.211.0.0/22
和35.191.0.0/16
。 - 在协议和端口下,选择指定的协议和端口。
- 选中 tcp 复选框,然后输入端口号
80
。 - 点击创建。
gcloud
gcloud compute firewall-rules create fw-allow-health-check \ --network=default \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp:80
预留外部 IP 地址
现在您的实例已启动并正在运行,接下来请设置一个全局静态外部 IP 地址,以供客户用来访问您的负载平衡器。
控制台
- 在 Google Cloud Console 中,转到外部 IP 地址页面。
- 如需预留 IPv4 地址,请点击预留静态地址。
- 对于名称,输入
lb-ipv4-1
。 - 将网络服务层级设置为优质。
- 将 IP 版本设置为 IPv4。
- 将类型设置为全局。
- 点击预留。
gcloud
gcloud compute addresses create lb-ipv4-1 \ --ip-version=IPV4 \ --global
请记下预留的 IPv4 地址:
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
设置负载平衡器
在此示例中,您将在客户端和负载平衡器之间使用 HTTPS,因此您需要一个或多个 SSL 证书资源来配置代理。我们建议您使用 Google 管理的证书。控制台
-
在 Google Cloud Console 中,转到负载平衡页面。
- 点击创建负载平衡器。
- 在 HTTP(S) 负载平衡下,点击开始配置。
- 选择从互联网到我的虚拟机,然后点击继续。
- 在负载平衡器名称中输入
web-map-https
。 - 点击后端配置。
- 在创建或选择后端服务和后端存储分区下,选择后端服务 > 创建后端服务。
- 为您的后端服务添加名称,例如
web-backend-service
。 - 在协议下,选择 HTTP。
- 在已命名端口中输入
http
。 - 在后端 > 新后端 > 实例组中,选择您的实例组
lb-backend-example
。 - 在端口号中输入
80
。 - 保留其他默认设置。
- 在运行状况检查下,选择创建运行状况检查,然后为您的运行状况检查添加一个名称,例如
http-basic-check
。 - 将协议设置为 HTTP,然后点击保存并继续。
- 选择启用 Cloud CDN。
- 保留其他默认设置。
- 点击创建。
- 在主机和路径规则中,保留默认设置。
- 在前端配置中,使用以下值:
- 将协议设置为 HTTPS。
- 将 IP 地址设置为您之前创建的
lb-ipv4-1
。 - 确保将端口设置为 443 以允许 HTTPS 流量。
- 点击证书下拉列表并选择您的主要 SSL 证书。
- 点击完成。
- 点击检查并最终确定。
- 配置完负载平衡器后,点击创建。
- 等待负载平衡器完成创建。
- 点击负载平衡器的名称。
- 在负载平衡器详情屏幕上,记下负载平衡器的 IP:端口。
gcloud
- 创建运行状况检查。
gcloud compute health-checks create http http-basic-check \ --port 80
- 创建后端服务。
gcloud compute backend-services create web-backend-service \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
- 将您的实例组作为后端添加到后端服务。
gcloud compute backend-services add-backend web-backend-service \ --instance-group=lb-backend-example \ --instance-group-zone=us-east1-b \ --global
- 创建网址映射,将传入的请求路由到默认的后端服务。
gcloud compute url-maps create web-map-https \ --default-service web-backend-service
- 创建全局 SSL 证书资源(如果您尚未创建),如下所示:
以下示例假定您已拥有一个名为
certificate-file
的证书文件和一个名为private-key-file
的私钥文件。该示例将创建一个名为www-ssl-cert
的 SSL 证书资源。gcloud compute ssl-certificates create www-ssl-cert \ --certificate=certificate-file \ --private-key=private-key-file \ --global
- 创建一个目标 HTTPS 代理将请求路由到您的网址映射。该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,因此您还需要在此步骤中加载证书。
gcloud compute target-https-proxies create https-lb-proxy \ --url-map web-map-https --ssl-certificates www-ssl-cert
- 创建全局转发规则以将传入请求路由到代理。
gcloud compute forwarding-rules create https-content-rule \ --address=lb-ipv4-1\ --global \ --target-https-proxy=https-lb-proxy \ --ports=443
启用 Cloud CDN
如果您在创建后端服务时尚未启用 Cloud CDN,请立即通过更新后端服务执行此操作:
gcloud compute backend-services update web-backend-service \ --enable-cdn \ --cache-mode=CACHE_MODE
将 CACHE_MODE 替换为以下项之一:
CACHE_All_STATIC
:自动缓存静态内容。标记为不可缓存的响应(Cache-Control
响应标头中的private
、no-store
或no-cache
指令)不会被缓存。为了缓存动态内容,内容必须具有有效的缓存标头。这是所有已启用 Cloud CDN 的新后端的默认行为。USE_ORIGIN_HEADERS
(默认值):要求源站设置有效缓存标头以缓存内容。不带这些标头的响应不会在 Google 边缘缓存,且需要根据每个请求完成访问源站的完整行程,这可能会影响源服务器性能并增加其负载。这是所有已启用 Cloud CDN 的现有后端的默认行为。FORCE_CACHE_ALL
:缓存所有内容,并忽略Cache-Control
响应标头中的任何private
、no-store
或no-cache
指令。这可能导致缓存特定于每位用户的(可识别用户个人身份信息的)非公开内容。您应仅在不会提供非公开内容或动态内容的后端(比如 Cloud Storage 存储分区)中启用此项设置。
如需自动从源站缓存静态响应,您可以使用 CACHE_ALL_STATIC
缓存模式设置。
如需使用 HTTP 缓存指令控制每个响应的可缓存性,请将缓存模式设置为使用源标头 (USE_ORIGIN_HEADERS
)。如需了解 Cloud CDN 理解的缓存指令以及 Cloud CDN 未缓存的内容,请参阅可缓存的内容和无法缓存的内容。
如果您的源站没有提供任何基于用户的动态内容,则您可能需要缓存来自源站的所有响应。为此,请使用 FORCE_CACHE_ALL
模式。此模式会缓存所有响应,而无需考虑内容类型或缓存指令。
如果您在后端上启用 Cloud CDN 时没有明确选择缓存模式,则该 API 和 gcloud
命令行工具默认为 USE_ORIGIN_HEADERS
,并且 Cloud Console 默认为 CACHE_ALL_STATIC
。
测试发送到您的实例的流量
现在负载平衡服务已运行,您可以将流量发送到转发规则并会发现流量被分散到不同的实例。
控制台
在 Google Cloud Console 中,转到负载平衡页面。
- 点击您刚刚创建的负载平衡器。
- 在后端部分中,确认虚拟机运行状况良好。运行状况良好列应该会填充相应信息,指示两个虚拟机运行状况都良好 (
2/2
)。否则,请先尝试重新加载页面。Cloud Console 可能需要一些时间才能指示虚拟机运行状况良好。如果几分钟后后端似乎仍运行状况不佳,请检查防火墙配置以及分配给后端虚拟机的网络标记。 - 如果您要使用 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态。
- 在 Cloud Console 显示后端实例运行状况良好后,您可以使用网络浏览器转到
https://IP_ADDRESS
来测试您的负载平衡器。将IP_ADDRESS
替换为负载平衡器的 IP 地址。 - 如果您使用自签名证书进行测试,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。
- 您的浏览器应该会呈现一个页面,其中的内容显示提供该页面的实例的名称以及其可用区(例如,
Page served from: lb-backend-example-xxxx
)。如果您的浏览器未呈现此页面,请查看本指南中的配置设置。
停用 Cloud CDN
控制台
为单个后端服务停用 Cloud CDN
- 在 Google Cloud Console 中,转到 Cloud CDN 页面。
- 在源站所在行的右侧,点击菜单 ,然后选择修改。
- 取消选中您想要停止使用 Cloud CDN 的所有后端服务的复选框。
- 点击更新。
为某个源站的所有后端服务移除 Cloud CDN
- 在 Cloud Console 中,转到 Cloud CDN 页面。
- 在源站所在行的右侧,点击菜单 ,然后选择移除。
- 点击移除进行确认。
gcloud
gcloud compute backend-services update BACKEND_SERVICE_NAME \ --no-enable-cdn
停用 Cloud CDN 后,系统不会使缓存失效或完全清除缓存。如果您停用然后重新启用 Cloud CDN,则大部分或所有缓存的内容仍可能会被缓存。为了防止内容通过缓存传送,您必须使该内容失效。
完成后,Cloud Console 将显示 HTTPS 负载平衡器的相关信息,如下所示。
将流量重定向到 HTTPS 负载平衡器
现在您已创建了 LB1 并验证它可以正常运行,接下来您可以创建 LB2(没有后端的部分 HTTP 负载平衡器),以将 HTTP 流量重定向到 LB1。
本示例使用 301 响应代码。您可以改用其他响应代码。
如需配置重定向,您可以使用 Google Cloud Console 或导入 YAML 文件。
如果您使用的是 gcloud
命令行工具,则必须确保目标 HTTP 代理指向重定向流量的网址映射。如果您使用的是 Cloud Console,则系统会为您处理此操作。
控制台
开始配置
- 在 Google Cloud Console 中,转到负载平衡页面。转到“负载平衡”
- 在 HTTP(S) 负载平衡下,点击开始配置。
- 选择从互联网到我的虚拟机,然后点击继续。
- 对于负载平衡器的名称,请输入
web-map-http
。 - 不关闭窗口继续操作。
跳过后端配置
- 跳过后端配置部分。
此负载平衡器不需要后端。
在网址映射中配置重定向
- 在页面左侧列中,点击主机和路径规则。
- 选择高级主机和路径规则(网址重定向、网址重写)。
- 在操作下,选择将客户端重定向到其他主机/路径。
- 在路径重定向下,选择完整路径重定向。
- 在重定向响应代码下,选择 301 - 永久移动。
- 在 HTTPS 重定向下,选择启用。
- 点击完成。
- 让负载平衡器配置页面保持打开状态以继续操作。
配置与 LB1 使用同一 IP 地址的 HTTP 转发规则
- 在负载平衡器配置页面中,点击前端配置。
- 在名称中输入
http-content-rule
。 - 将协议设置为 HTTP。
- 将 IP 版本设置为 IPv4。
- 将 IP 地址设置为您用于 HTTPS 负载平衡器的 IP 地址。
- 确保将端口设置为 80 以允许 HTTP 流量。
- 点击完成。
- 不关闭窗口继续操作。
检查配置
- 在左侧面板中,点击检查并最终确定。
- 比较您的设置与您打算创建的内容。
- 如果看起来都正确,请点击创建。
gcloud
创建 YAML 文件
/tmp/web-map-http.yaml
。以下示例使用 MOVED_PERMANENTLY_DEFAULT 作为响应代码。kind: compute#urlMap name: web-map-http defaultUrlRedirect: redirectResponseCode: MOVED_PERMANENTLY_DEFAULT httpsRedirect: True
通过导入 YAML 文件创建 HTTP 负载平衡器的网址映射。此网址映射的名称为
web-map-http
。gcloud compute url-maps import web-map-http \ --source /tmp/web-map-http.yaml \ --global
如果您正在更新现有网址映射,系统会显示以下提示:
Url Map [web-map-http] will be overwritten. Do you want to continue (Y/n)?
如需继续,请按 Y。
验证网址映射已更新。您的 HTTP 负载平衡器的网址映射应如下所示:
gcloud compute url-maps describe web-map-http
creationTimestamp: '2020-03-23T10:53:44.976-07:00' defaultUrlRedirect: httpsRedirect: true redirectResponseCode: MOVED_PERMANENTLY_DEFAULT fingerprint: 3A5N_RLrED8= id: '2020316695093397831' kind: compute#urlMap name: web-map-http selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
使用
web-map-http
作为网址映射创建新的目标 HTTP 代理或更新现有目标 HTTP 代理。gcloud compute target-http-proxies create http-lb-proxy \ --url-map=web-map-http \ --global
或
gcloud compute target-http-proxies update http-lb-proxy \ --url-map=web-map-http \ --global
创建全局转发规则以将传入请求路由到代理。
gcloud compute forwarding-rules create http-content-rule \ --address=lb-ipv4-1 \ # Same IP address used for HTTPS load balancer --global \ --target-http-proxy=http-lb-proxy \ --ports=80
完成后,Cloud Console 将显示两个负载平衡器,如下所示。
Cloud Console 将显示 web-map-http
负载平衡器的相关信息,如下所示。
测试从 HTTP 到 HTTPS 的重定向
请记下您用于两个负载平衡器的预留 IP 地址。
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
在本示例中,假设预留 IP 地址为 34.98.77.106
。http://34.98.77.106/
网址会重定向到 https://34.98.77.106/
。
几分钟后,您可以通过运行以下 curl
命令来进行测试。请务必将 34.98.77.106
替换为您预留的 IP 地址。
curl 34.98.77.106:80
示例输出:
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="https://34.98.77.106/">here</A>. </BODY></HTML>