504 网关超时 - 路由器超时

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

问题

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

此错误响应表示在 API 调用执行期间,客户端没有及时从 Apigee Edge 或后端服务器收到响应。

错误消息

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

HTTP/1.1 504 Gateway Time-out

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

<!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>

导致超时的原因是什么?

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

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

本指南介绍了如何排查和解决路由器超时导致的 504 错误。

路由器超时

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

可能的原因

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

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

常见诊断步骤

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

  • API 监控
  • NGINX 访问日志

API 监控

要使用 API Monitoring 诊断错误,请执行以下操作:

  1. 前往 Analyze > API Monitoring > Investigate 页面。
  2. 过滤出 5xx 个错误,然后选择时间范围。
  3. 根据时间绘制状态代码
  4. 点击显示 504 错误的特定单元格,以了解更多详情和有关这些错误的日志,如下所示:

    显示 504 错误的示例

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

    流量日志窗口中,请注意部分 504 错误的以下详细信息:

    • 请求:此属性提供用于进行调用的请求方法和 URI
    • 响应时间:此字段提供请求所用的总时间。

    在上面的示例中,

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

    您还可以使用 API Monitoring GET Logs API 来获取所有日志。例如,通过查询 orgenvtimeRangestatus 的日志,您可以下载客户端超时的事务的所有日志。

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

    For example :

    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 错误的以下信息:
    • 响应时间
    • Request URI

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

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

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

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

  5. 使用请求 字段中的基础路径来确定哪个 API 代理是发出请求的。

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

诊断

  1. 确定 504 错误是否是由路由器在消息处理器返回响应前已超时导致的。为此,您可以使用 API Monitoring 或 NGINX Access Common 诊断步骤查看 API Monitoring 中的 API Monitoring 中的 Response Time/路由器中的 Request Time 中的响应时间(这两个字段代表的信息相同,但调用的名称不同)是否与路由器/虚拟主机上配置的 I/O 超时相同,以及 Fault SourceFault ProxyFault Code 字段是否设置为 -
  2. 检查在路由器或特定虚拟主机上配置的 I/O 超时值是否低于在消息处理器或特定 API 代理上配置的 I/O 超时值

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

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

Edge 界面

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

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

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

Management API

您也可以使用以下管理 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
    

    Private Cloud 用户

    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 设置的值。

    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 秒。如果您有多个虚拟主机,则将针对每个虚拟主机看到此信息。获取用于进行 API 调用(失败并显示 504 错误)的特定虚拟主机的 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 界面中,选择要在哪个特定 API 代理中查看 ServiceCallout 政策的新 I/O 超时值。
  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 超时中的说明,在虚拟主机上设置超时。