503 服务不可用 - 代理隧道创建失败,并显示 403

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

问题

客户端应用收到 HTTP 状态代码 503 Service Unavailable 及错误代码 protocol.http.ProxyTunnelCreationFailed,作为 API 调用的响应。

错误消息

客户端应用会获得以下响应代码:

HTTP/1.1 503 Service Unavailable

此外,您可能还会看到以下错误消息:

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

转发代理和隧道

Apigee Edge 允许您的 API 代理通过代理服务器与后端服务器通信,如 配置转发代理中所述。代理服务器会根据所使用的代理类型(由属性 HTTPClient.proxy.type 指示)与后端服务器建立安全 (HTTPS) 或非安全 (HTTP) 连接,并双向传输数据。这称为隧道技术

默认情况下,Apigee Edge 对所有流量使用隧道技术。如需停用隧道技术,需要将属性 HTTPClient.use.tunneling 设置为 false

错误代码:protocol.http.ProxyTunnelCreationFailed

如果代理服务器因防火墙、ACL(访问控制列表)限制、DNS 问题、后端服务器不可用、超时等任何问题而无法在 Apigee Edge 与后端服务器之间创建隧道,Apigee Edge 将返回错误代码 protocol.http.ProxyTunnelCreationFailed

Apigee Edge 响应的 faultstring 中的状态代码通常表示可能导致此错误的高级原因。

Faultstring 模板

Proxy refused to create tunnel with response status STATUS_CODE

在 faultstring 中观察到某些状态代码的可能原因包括

下表介绍了根据 faultstring 中指示的状态代码可能的原因:

故障字符串 说明
代理拒绝创建响应状态为“403”的隧道

403 - Forbidden

发生这种情况可能是由于后端服务器上配置的防火墙或 ACL 限制阻止创建隧道所致。

代理拒绝创建响应状态为“503”的隧道

503 - Service Unavailable

这可能是由于 DNS 问题、防火墙限制、后端服务器不可用而导致隧道创建的

代理拒绝创建响应状态为 504 的隧道

504 - Gateway Timeout

如果在隧道创建过程中超时,就可能发生这种情况

根据在 faultstring 中观察到的状态代码,您需要采用适当的方法来排查问题。本手册说明如果您在错误代码 protocol.http.ProxyTunnelCreationFailedfaultstring中观察到状态代码403 ,应如何排查问题。

可能的原因

如果后端服务器上配置了任何防火墙或 ACL(访问控制列表)限制,阻止代理服务器在 Apigee Edge 和后端服务器之间创建隧道,就会发生此错误(状态代码 403)。

原因 说明 适用的问题排查说明
代理拒绝创建响应状态为 403 的隧道 Host 标头中收到代理服务器主机名而不是后端服务器主机名时,代理服务器会拒绝创建隧道。 仅限 Edge Private Cloud 用户

常见诊断步骤

使用以下工具/技巧之一来诊断此错误:

跟踪工具

如需使用跟踪工具诊断错误,请执行以下操作:

  1. 启用跟踪会话,并执行以下任一操作:
    • 等待错误发生,或者
    • 如果您可以重现问题,请通过503 Service Unavailable 针对 Proxy refused to create tunnel with response status 403进行 API 调用来重现问题。
  2. 确保已启用 Show all FlowInfos

  3. 选择其中一个失败的请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,并找到发生故障的位置。
  5. 您通常会在 Target Request Flow Started 阶段后看到该错误,如下所示:

    请注意以下信息:

    错误Proxy refused to create tunnel with response status 403

  6. 进入跟踪记录中的 AX(已记录 Google Analytics(分析)数据)阶段,然后点击该阶段。
  7. 向下滚动到 Phase Details Response Headers 部分,并确定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

    查看大图

    查看大图

  8. 您将看到 X-Apigee-fault-codeX-Apigee-fault-source 的值分别是 protocol.http.ProxyTunnelCreationFailedtarget ,这表明导致此错误的原因在于代理隧道创建失败,原因是未收到预期的主机标头。

    响应标头
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

如需使用 NGINX 访问日志诊断错误,请执行以下操作:

  1. 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来确定有关 HTTP 503 Service Unavailable 错误的关键信息。
  2. 检查 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    其中:将 ORGORGPORT# 替换为实际值。

  3. 搜索以查看在特定持续时间内是否存在任何错误代码为 protocol.http.ProxyTunnelCreationFailed503 错误(如果问题在过去发生过),或者是否有任何请求仍然失败并显示 503
  4. 如果您确实发现 X-Apigee-fault-code X-Apigee-fault-code 的值匹配的任何 503 错误,请确定 X-Apigee-fault-code 的值。

    NGINX 访问日志中的 503 错误示例

    NGINX 访问日志中的上述示例条目具有 X- Apigee-fault-codeX-Apigee-fault-source 的以下值:

    响应标头
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

原因:代理拒绝创建响应状态为 403 的隧道

诊断

  1. 使用 Trace 工具或 NGINX 访问日志确定 503 Service UnavailableFault CodeFault Source,如常见诊断步骤中所述。
  2. 查看错误消息,并确定 faultstring 中指示的隧道创建失败的状态代码
  3. 在这种情况下,状态代码为 403,表示 Forbidden
  4. 这意味着没有足够的权限或特权来创建隧道。如果存在任何阻止创建隧道的防火墙或 ACL(访问控制列表)限制,通常就会发生这种情况。
  5. 检查后端服务器上已配置的所有可能会阻止创建隧道的防火墙和/或 ACL 限制。
  6. 根据防火墙和/或 ACL 限制的类型,您需要适当地解决问题。
  7. 让我们通过一个防火墙限制示例来说明如何排查和解决此问题:

    场景:后端服务器的防火墙限制要求主机标头应始终包含后端服务器主机名

    您可以采用以下方法之一来确定 Apigee Edge 传递的主机标头:

    跟踪记录

    要使用 Trace 确定主机标头,请执行以下操作:

    1. 使用跟踪记录确定 faultstring 包含 Proxy refused to create tunnel with response status 403,如常见诊断步骤中所述。
    2. 进入目标请求流程已开始阶段并查看请求标头
    3. 验证请求标头部分的主机标头中指定的主机名的值。
    4. 如果 Host 标头包含代理主机名,这就是导致此错误的原因。
    5. 这是因为后端服务器上的防火墙配置为仅在主机标头包含后端服务器的名称时接受请求。
    6. 因此,当代理服务器尝试创建具有后端服务器的隧道时,会失败并显示以下错误:

      Proxy refused to create tunnel with response status 403.

      显示具有代理主机名的主机标头的示例跟踪记录

      查看大图

      在上面显示的示例跟踪记录中,主机标头包含代理主机的名称www.proxyserver.com. 由于后端服务器上配置了防火墙限制,它只预期后端服务器主机名包含在主机标头中,因此您会收到错误 Proxy refused to create tunnel with response status 403

    tcpdump

    使用 tcpdump 确定主机标头

    1. 使用以下命令在代理服务器上捕获来自 Apigee Edge 的消息处理器组件的请求的 tcpdump

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      如需详细了解如何使用 tcpdump 命令,请参阅 tcpdump

    2. 使用 Wireshark 工具或类似工具分析 tcpdump 数据。
    3. 以下是使用 Wireshark 对 tcpdump 进行分析的示例:

      查看大图

    4. 数据包编号 131415 表示消息处理器正在通过三向 TCP 握手过程与代理服务器建立连接。
    5. 在数据包 16 中,消息处理器已连接到代理主机 httpbin.org(如上例所示)。
    6. 选择数据包 16 并详细检查数据包的内容,尤其是消息处理器传递至代理服务器的主机标头

    7. 上面的示例显示了主机标头 httpin.org,它是代理服务器的主机名。因此,当代理服务器尝试通过传递上述主机标头 httpin.org 与后端服务器创建隧道时,会失败并显示错误 Proxy refused to create tunnel with response status 403

分辨率

场景:代理服务器的防火墙限制要求主机标头应始终包含后端服务器主机名

如果您已确定导致此错误的原因在于后端服务器上的防火墙已配置为要求主机标头应始终包含backend服务器主机名,而消息处理器正在发送backend主机名,然后执行以下步骤来解决问题:

  1. 将 TargetEndpoint 中的 use.proxy.host.header.with.target.uri 属性设置为 true,如以下示例所示:

    TargetEndpoint 配置示例

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  2. 确保按如下方式在消息处理器上配置与 转发代理相关的其他属性:

    1. 查看每个消息处理器上的 /opt/apigee/customer/application/message-processor.properties 文件。
    2. 确保根据您的用例或要求设置以下属性:

      属性的示例值

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD
      

必须收集的诊断信息

如果按照上述说明操作后,问题仍然存在,请收集以下诊断信息,然后联系 Apigee Edge 支持团队

如果您是 Private Cloud 用户,请提供以下信息:

  • 观察到失败请求的完整错误消息
  • 环境名称
  • API 代理软件包
  • API 请求的跟踪文件
  • NGINX 访问日志

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中:将 ORGENVPORT# 替换为实际值。

  • 消息处理器系统日志

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

参考