504 网关超时 - 路由器超时

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

问题

客户端应用收到 HTTP 状态代码 504,并显示消息 Gateway Timeout 以响应 API 调用。

此错误响应表示客户端在执行 API 调用期间未收到来自 Apigee Edge 或后端服务器的及时响应。

出错提示

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

HTTP/1.1 504 Gateway Time-out

使用 c网址 或 Web 浏览器调用此类代理时,您可能会收到以下错误:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

导致超时的原因是什么?

通过 Edge 平台发出 API 请求的典型路径为客户端 > 路由器 > 消息 处理器 > 后端服务器 ,如下图所示:

Apigee Edge 运行时流程中的所有组件(包括客户端、路由器、消息 处理器和后端服务器)都设置了合适的默认超时值,以确保 API 请求不会花费太长时间才能完成。如果流程中的任何组件未在超时配置中指定的时间段内从上游组件获取响应,则该特定组件将超时,并且通常会返回 504 Gateway Timeout 错误。

此 playbook 介绍了如何排查和解决由路由器超时引起的 504 错误。

路由器超时

Apigee Edge 中配置在路由器上的默认超时时间为 57 秒。这是 API 代理从 Edge 收到 API 请求到发送回响应(包括后端响应和所有执行的政策)的最长执行时间。可以在路由器/虚拟主机上替换默认超时时间,如在 路由器上配置 I/O 超时中所述。

可能的原因

在 Edge 中,由于路由器超时而导致 504 Gateway Timeout 错误的典型原因如下:

原因 说明 适用的问题排查说明
路由器上的超时配置不正确 如果为路由器配置了不正确的 I/O 超时期限,则会发生这种情况。 Edge 公有云和私有云用户

常见诊断步骤

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

  • API 监控
  • NGINX 访问日志

API 监控

如需使用 API 监控诊断错误,请执行以下操作:

  1. 依次前往分析 > API 监控 > 调查 页面。
  2. 过滤 5xx 错误并选择时间范围。
  3. 绘制状态代码 与时间 的关系图。
  4. 点击显示 504 错误的特定单元格,以查看更多详细信息并查看 有关这些错误的日志,如下所示:

    显示 504 错误的示例

  5. 在右侧窗格中,点击查看日志 。

    在流量日志 窗口中,记下一些 504 错误的以下详细信息:

    • 请求 :提供用于进行调用的请求方法和 URI
    • 响应 时间 :提供请求的总耗时。

    在上面的示例中,

    • 请求 指向 GET /test-timeout。
    • 响应时间 为 57.001 秒。这表示路由器 在消息处理器响应之前已超时,因为该值非常接近 路由器上设置的默认 I/O 超时时间( 57 秒)。

    您还可以使用 API 监控 GET 日志 API。 例如,通过查询 org、env、timeRange 和 status 的日志,您可以下载客户端超时的所有事务的日志。

    由于 API 监控将这些 504 错误的代理设置为 -(not set),因此您可以使用 API(Logs API)获取虚拟主机和路径的关联代理。

    例如:

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. 查看其他 504 错误的 响应时间 ,并检查所有 504 错误的 响应时间 是否一致(路由器上设置的 I/O 超时值为 57 秒)。

NGINX 访问日志

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

  1. 查看 NGINX 访问日志:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 搜索以查看在特定时间段内(如果问题发生在过去)是否存在任何 504 错误,或者是否仍有任何请求失败并显示 504。
  3. 记下一些 504 错误的以下信息:
    • 响应时间
    • 请求 URI

    在此示例中,我们看到以下信息:

    • 请求时间 :57.001 秒。这表示 路由器在 57.001 秒后超时。

    • 请求 :GET /test-timeout
    • 主机别名: myorg-test.apigee.net
  4. 检查请求时间 是否与路由器/虚拟主机上配置的 I/O 超时时间 相同。如果是,则表示路由器在 消息处理器未在此期间响应之前超时。

    在上面显示的示例 NGINX 访问日志条目中,请求 时间 57.001 秒非常接近路由器上设置的默认 I/O 超时时间。这清楚地表明路由器在消息 处理器响应之前超时。

  5. 使用 请求 字段中的基本路径确定发出请求的 API 代理。

原因:路由器上的超时配置不正确

诊断

  1. 确定 504 错误是否是由于路由器在 消息处理器响应之前超时而导致的。您可以检查 API 监控中的响应时间/路由器中的请求时间 (这两个字段表示相同的信息,但名称不同)是否与路由器/虚拟主机上配置的 I/O 超时时间相同,以及故障来源 、故障代理 和故障代码 字段是否使用 API 监控或 NGINX 访问日志设置为 -,如 常见诊断步骤中所述。
  2. 检查路由器或特定虚拟主机上配置的 I/O 超时值是否比消息处理器或特定 API 代理上配置的 I/O 超时值 低。

    您可以按照本部分中的步骤执行此操作。

验证虚拟主机上的 I/O 超时

Edge 界面

如需使用 Edge 界面验证虚拟主机超时,请执行以下操作:

  1. 登录 Edge 界面。
  2. 依次前往管理 > 虚拟主机 。
  3. 选择遇到超时问题的特定环境 。
  4. 选择要验证 I/O 超时值的特定虚拟主机。
  5. 在属性下,查看代理读取超时值(以秒为单位)。

    在上面的示例中,代理读取超时 配置的值为 120。这意味着在此虚拟主机上配置的 I/O 超时时间为 120 秒。

Management API

您还可以使用以下 Management API 验证代理读取超时 :

  1. 执行 Get virtual host API 以获取 virtualhost 配置,如下所示:

    公有云用户

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    私有云用户

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    其中:

    ORGANIZATION_NAME 是组织的名称

    ENVIRONMENT_NAME 是环境的名称

    VIRTUALHOST_NAME 是虚拟主机的名称

  2. 检查为属性 proxy_read_timeout 配置的值

    虚拟主机定义示例

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }

    在上面的示例中,proxy_read_timeout 配置的值为 120。这意味着在此虚拟主机上配置的 I/O 超时时间为 120 秒。

验证 router.properties 文件中的 I/O 超时

  1. 登录路由器机器。
  2. 在 /opt/nginx/conf.d 目录中搜索属性 proxy_read_timeout,并检查是否已使用新值进行设置,如下所示:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. 检查在特定虚拟主机配置文件中为属性 proxy_read_timeout 设置的值。 host configuration file.

    grep 命令的示例结果

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;

    在上面的示例输出中,请注意,属性 proxy_read_timeout 已 在 0-default.conf 中设置为新值 57,这是默认虚拟主机的配置文件。这表示路由器上为 配置的 I/O 超时时间为 57 秒,适用于默认虚拟主机。如果您有 多个虚拟主机,您将看到每个虚拟主机的此信息。获取用于发出失败并显示 504 错误的 API 调用的特定虚拟主机的 proxy_read_timeout 值。

验证 API 代理中的 I/O 超时

您可以在以下位置查看 I/O 超时:

  • API 代理的目标端点
  • API 代理的 ServiceCallout 政策
查看 API 代理的目标端点中的 I/O 超时
  1. 在 Edge 界面中,选择要查看 I/O 超时值的特定 API 代理。
  2. 选择要检查的特定目标端点。
  3. 在 TargetEndpoint 配置的 <HTTPTargetConnection> 元素下查看具有适当值的属性 io.timeout.millis。

    例如,以下代码中的 I/O 超时时间设置为 120 秒:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
查看 API 代理的 ServiceCallout 政策中的 I/O 超时
  1. 在 Edge 界面中,选择要查看 ServiceCallout 政策的新 I/O 超时值的特定 API 代理。
  2. 选择要检查的特定 ServiceCallout 政策。
  3. 在 <ServiceCallout> 配置下查看具有适当值的 <Timeout> 元素。

    例如,以下代码的 I/O 超时时间将为 120 秒:

    <Timeout>120000</Timeout>

验证消息处理器上的 I/O 超时

  1. 登录消息处理器机器。
  2. 使用以下命令在 /opt/apigee/edge-message-processor/conf 目录中搜索属性 HTTPTransport.io.timeout.millis:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    示例输出

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
  3. 在上面的示例输出中,请注意,属性 HTTPTransport.io.timeout.millis 已在 http.properties 中设置为值 55000。这表示 I/O 超时已成功配置为 消息处理器上的 55 秒。

确定路由器和消息处理器上配置的超时时间后,验证路由器/虚拟主机上配置的超时值是否低于消息处理器/API 代理上的超时值。

记下所有层上设置的值,如下表所示:

路由器超时时间(秒) 虚拟主机超时时间(秒) 消息处理器超时时间(秒) API 代理超时时间(秒)
57 - 55 120

在此示例中,

  • 路由器上配置了默认值 57 秒。
  • 未在特定虚拟主机上设置超时值。这意味着它将使用 路由器本身上配置的默认值 57 秒。
  • 在消息处理器上,配置了默认值 55 秒。
  • 但是,在特定 API 代理上,配置的值为 120 秒。

请注意,较高的超时值仅在 API 代理上配置,但路由器仍 配置为 57 秒。因此,路由器在 57 秒时超时,而消息 处理器/后端仍在处理您的请求。这会导致路由器向客户端应用返回 504 Gateway Timeout 错误。

分辨率

请执行以下步骤,在路由器和消息 处理器上配置正确的 I/O 超时时间,以解决此问题。

  1. 请参阅 配置 I/O 超时的最佳实践,了解应在通过 Apigee Edge 的 API 请求流程中涉及的不同组件上设置哪些超时值 。
  2. 在上面的示例中,如果您确定需要设置更高的超时值,因为后端服务器需要更长的时间,并且您已将消息处理器的超时值增加到 120 秒,那么请在路由器上设置更高的超时值。例如:123 seconds。为避免因新的超时值而影响所有 API 代理 ,请仅在特定 API 代理中使用的特定虚拟主机上设置 123 seconds 的值。
  3. 按照在 路由器上配置 I/O 超时中的说明在虚拟主机上设置超时时间。