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

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
info

问题

客户端应用收到 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中指示的状态代码:

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. 启用 跟踪会话,然后执行以下任一操作:
    • 等待错误发生,或
    • 如果您可以重现问题,请进行 API 调用以重现问题 503 Service Unavailable 并显示 Proxy refused to create tunnel with response status 403.
  2. 确保已启用显示所有 FlowInfo

  3. 选择其中一个失败的请求,然后检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,找到发生失败的位置 。
  5. 您通常会在目标请求流已启动 阶段之后看到错误,如下所示:

    请注意以下信息:

    错误Proxy refused to create tunnel with response status 403

  6. 在跟踪记录中前往 AX (已记录分析数据)阶段,然后点击该阶段。
  7. 向下滚动到阶段详细信息 响应标头 部分,然后 确定 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. 如果您确实发现任何 503 错误,并且 X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed 的值匹配,请确定 X-Apigee-fault-source 的值。

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

    在上面的 NGINX 访问日志示例条目中,X- Apigee-fault-code X-Apigee-fault-source: 的值如下:

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

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

诊断

  1. 使用跟踪工具或 NGINX 访问日志确定 503 Service Unavailable故障代码故障来源,如 常见诊断步骤中所述。
  2. 查看 错误消息,确定 状态代码faultstring 中指示的,以了解隧道创建失败的原因。
  3. 在这种情况下,状态代码为 403,表示禁止
  4. 这意味着创建隧道的权限或特权不足。如果存在任何阻止创建隧道的防火墙或 ACL(访问控制列表)限制,通常会出现这种情况。
  5. 查看后端服务器上配置的任何防火墙和/或 ACL 限制,这些限制 可能会阻止创建隧道。
  6. 您需要根据防火墙和/或 ACL 限制的类型,相应地解决问题 。
  7. 我们以防火墙限制为例,说明如何排查和解决此 问题:

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

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

    跟踪记录

    如需使用跟踪记录确定 Host 标头,请执行以下操作:

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

      Proxy refused to create tunnel with response status 403

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

      查看大图

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

    tcpdump

    如需使用 tcpdump 确定 Host 标头,请执行以下操作

    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,详细检查数据包的内容,特别是消息处理器传递给代理服务器的 Host 标头

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

分辨率

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

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

  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

参考