反模式:使用相同的主机别名和端口号定义多个虚拟主机

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

在 Apigee Edge 中,路由器负责处理所有传入的 API 流量。这意味着对 Edge API 代理的所有 HTTP 和 HTTPS 请求首先由 Edge Router 路由器处理。因此,API 代理请求必须定向到 IP 地址和路由器上的开放端口。

通过虚拟主机,您可以在单个服务器或一组服务器上托管多个域名。对于 Edge,各个服务器对应于边缘路由器。通过在路由器上定义虚拟主机,您可以处理发送到多个网域的请求。

Edge 上的虚拟主机定义协议(HTTP 或 HTTPS),以及路由器端口和主机别名。主机别名通常是映射到路由器 IP 地址的 DNS 域名。

例如,下图显示了一个具有两个虚拟主机定义的路由器:

本示例中有两个虚拟主机定义。其中一个处理网域 domainName1 上的 HTTPS 请求,另一个处理 domainName2 上的 HTTP 请求。

在向 API 代理发出请求时,路由器会将传入请求的主机标头和端口号与所有虚拟主机定义的主机别名列表进行比较,以确定哪个虚拟主机处理请求。

虚拟主机的示例配置如下所示:

vhost 配置示例

反模式

如果在组织或不同组织的相同/不同环境中定义具有相同主机别名和端口号的多个虚拟主机,则会导致在路由 API 请求时造成混淆,并可能导致意外错误/行为。

让我们通过一个示例来说明让多个虚拟主机具有相同的主机别名的影响。

假设有两个虚拟主机sandbox and secure 定义了同一个主机别名,即api.company.abc.com

具有相同别名的 vhost

使用上述设置时,可能会出现下面各部分所述的两种情况。

场景 1:API 代理配置为仅接受对其中一个虚拟主机沙盒的请求

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

在这种情况下,当客户端应用使用主机别名 api.company.abc.com 调用特定 API 代理时,会间歇性地收到 404 错误,并显示以下消息:

Unable to identify proxy for host: secure 

这是因为路由器会将请求同时发送到 sandboxsecure 虚拟主机。当请求路由到 sandbox 虚拟主机时,客户端应用将收到成功响应。但是,当请求路由到 secure 虚拟主机时,客户端应用将收到 404 错误,因为 API 代理未配置为接受 secure 虚拟主机上的请求。

情形 2:API 代理配置为接受对虚拟主机沙盒和安全的

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

在这种情况下,当客户端应用使用主机别名 api.company.abc.com 调用特定 API 代理时,它们将根据代理逻辑获得有效响应。

但是,这会导致在 Google Analytics(分析)中存储的数据不正确,因为 API 请求被路由到这两个虚拟主机,而实际请求旨在只发送到一个虚拟主机。

这也会影响日志记录信息以及基于虚拟主机的任何其他数据。

影响

  1. 404 错误,因为 API 请求可能会被路由到一个虚拟主机,但 API 代理可能未配置为接受这些请求。
  2. Google Analytics(分析)数据不正确,因为 API 请求被路由到具有相同主机别名的所有虚拟主机,而请求仅针对某个特定虚拟主机。

最佳做法

  • 请勿在同一环境或组织的不同环境中定义多个具有相同主机别名和端口号的虚拟主机。
  • 如果需要定义多个虚拟主机,则在每个虚拟主机中使用不同的主机别名,如下所示:

    两个虚拟机

深入阅读