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

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

在 Apigee Edge 中,路由器会处理所有传入的 API 流量。也就是说,所有 HTTP 和 HTTPS 发送到 Edge API 代理的请求首先由 Edge Router 处理。因此,API 代理请求 定向至 IP 地址和路由器上的开放端口。

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

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

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

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

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

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

vhost 配置示例

反模式

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

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

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

具有相同别名的虚拟主机

进行上述设置时,可能会出现两种情况,如以下部分所述。

情景 1 :API 代理配置为仅接受发送到其中一个虚拟 Hosts Sandbox

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

在此情形中,当客户端应用使用 主机别名 api.company.abc.com,则他们将间歇性收到 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 同时访问两个虚拟主机,而实际请求仅发送到一个虚拟主机。

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

影响

  1. 404 错误,因为 API 请求可能会路由到 API 代理可能无法访问的虚拟主机 配置为接受请求
  2. Google Analytics 数据不正确,因为 API 请求被路由到具有 但仅针对某个特定虚拟主机发出请求。

最佳做法

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

    两个虚拟主机

深入阅读