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

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

问题

客户端应用将收到带有 503 Service Unavailable 的 HTTP 状态代码, 错误代码 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 代理通过代理与后端服务器通信 如 <ph type="x-smartling-placeholder"></ph> 配置转发代理。代理服务器会打开安全 (HTTPS) 或非安全 与后端服务器的 (HTTP) 连接,具体取决于代理类型(指示的代理类型) (由 HTTPClient.proxy.type 属性指定),并传输数据 两个方向。这称为隧道技术

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

<ph type="x-smartling-placeholder">

错误代码:protocol.http.ProxyTunnelCreationFailed

如果存在以下情况,Apigee Edge 会返回错误代码 protocol.http.ProxyTunnelCreationFailed: 由于任何原因,代理服务器无法在 Apigee Edge 和后端服务器之间创建隧道, 防火墙、ACL(访问控制列表)限制、DNS 问题、后端服务器等问题 不可用性、超时等

通常情况下,Apigee Edge 所返回响应的 faultstring 中的状态代码 指示导致此错误的高级别原因。

错误字符串模板

Proxy refused to create tunnel with response status STATUS_CODE

导致在错误字符串中观察到的某些状态代码的可能原因

下表根据 faultstring:

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

403 - Forbidden

这可能是由于在 Gmail 上配置了防火墙或 ACL 限制 阻止创建隧道的后端服务器。

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

503 - Service Unavailable

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

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

504 - Gateway Timeout

如果创建隧道期间出现超时,则可能会发生这种情况

<ph type="x-smartling-placeholder">

根据在 faultstring 中观察到的状态代码,您需要使用 来排查问题。本指南介绍了如何排查 如果您在 faultstring 中看到状态代码 403 ,就会发现相应问题 错误代码 protocol.http.ProxyTunnelCreationFailed

可能的原因

如果存在任何防火墙或 ACL(访问403 控制列表)的限制,以阻止隧道被 由代理服务器在 Apigee Edge 和后端服务器之间创建。

<ph type="x-smartling-placeholder">
原因 说明 适用的问题排查说明
代理拒绝创建响应状态为 403 的隧道 代理服务器收到代理服务器主机名后拒绝创建隧道 而不是 Host 标头中的后端服务器主机名。 仅面向 Edge Private Cloud 用户

常见诊断步骤

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

跟踪工具

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

  1. 启用跟踪会话并 您可以: <ph type="x-smartling-placeholder">
      </ph>
    • 等待错误发生,或者
    • 如果您可以重现问题,请进行 API 调用以重现问题 503 Service Unavailable 使用 Proxy refused to create tunnel with response status 403
  2. 确保已启用 Show all FlowInfos

  3. 选择其中一个失败请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段并找到失败之处 错误。
  5. 通常在“目标请求流程已开始”阶段之后,您通常会看到该错误 如下所示:

    请注意以下信息:

    错误Proxy refused to create tunnel with response status 403

  6. 进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段,然后点击该阶段。
  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

<ph type="x-smartling-placeholder">

如需使用 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. 搜索是否存在任何带有错误代码的 503 错误 protocol.http.ProxyTunnelCreationFailed(如果 过去出现的问题),或者是否有任何请求仍以失败告终, 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 的隧道

<ph type="x-smartling-placeholder">

诊断

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

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

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

    Trace

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

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

      Proxy refused to create tunnel with response status 403

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

      ( 查看大图

      在上面显示的示例跟踪记录中,它显示 Host Header 包含 代理主机的名称www.proxyserver.com. 由于存在 在后端服务器上配置的防火墙限制 错误 Proxy refused to create tunnel with response status 403

    tcpdump

    要使用 tcpdump 确定主机标头

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

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

      如需详细了解如何使用 tcpdump 命令,请参阅 <ph type="x-smartling-placeholder"></ph> tcpdump.

    2. 使用tcpdump Wireshark 工具或类似工具 工具。
    3. 以下是对 <ph type="x-smartling-placeholder"></ph> tcpdump

      ( 查看大图

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

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

分辨率

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

如果您已经确定了此错误是因为后端服务器上的防火墙 配置为“主机标头”应始终包含“后端”服务器 主机名,同时邮件处理器发送代理服务器主机名,然后执行 请按照以下步骤解决此问题:

  1. use.proxy.host.header.with.target.uri TargetEndpoint,如以下示例所示:

    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>
    
    <ph type="x-smartling-placeholder">
  2. 确保与 <ph type="x-smartling-placeholder"></ph> 转发代理在消息处理器上配置,如下所示:

    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
      
      <ph type="x-smartling-placeholder">

必须收集的诊断信息

按照上述说明操作后,如果问题依然存在,请收集以下内容 然后联系 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
    

参考