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

您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
info

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

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

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

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

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

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

下面显示了虚拟主机的配置示例:

虚拟主机配置示例

反模式

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

下面我们通过一个示例来解释具有相同主机别名的多个虚拟主机会产生的影响。

假设在某个环境中定义了两个虚拟主机 sandbox and secure ,它们具有相同的主机别名,即api.company.abc.com

具有相同别名的虚拟主机

在上述设置中,可能会出现以下部分中所述的两种情况。

情况 1:API 代理配置为仅接受对虚拟 主机 sandbox 的请求

<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 代理配置为接受对虚拟主机 sandbox 和 secure 的请求

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

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

但是,这会导致 Analytics 中存储的数据不正确,因为 API 请求会路由到 两个虚拟主机,而实际请求原本应仅发送到一个虚拟主机。

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

影响

  1. 404 错误,因为 API 请求可能会路由到 API 代理可能未 配置为接受请求的虚拟主机。
  2. Analytics 数据不正确,因为 API 请求会路由到具有相同主机别名的所有虚拟主机,而请求仅针对特定虚拟主机发出。

最佳做法

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

    两个虚拟主机

深入阅读