504 网关超时 - 路由器超时

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

问题

客户端应用收到 HTTP 状态代码 504 以及消息 Gateway Timeout 以响应 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>

哪些原因会导致超时?

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

Apigee Edge 运行时流程中的所有组件,包括客户端、路由器、消息 处理器和后端服务器设置了合适的默认超时值, 确保 API 请求不会花费太长时间来完成。如果模板中的任一组件 数据流未在 超时配置,则特定组件将超时,并且通常会返回一个 504 Gateway Timeout错误。

本指南介绍了如何排查和解决因以下原因导致的 504 错误: 则路由器会超时。

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

路由器超时

在 Apigee Edge 中,路由器上配置的默认超时时间为 57 秒。这是 从 Edge 上收到 API 请求到 API 代理可以执行的时间 系统将返回响应,包括后端响应和执行的所有政策。 可以在路由器/虚拟主机上覆盖默认超时,如 <ph type="x-smartling-placeholder"></ph> 在路由器上配置 I/O 超时

可能的原因

在 Edge 中,导致 504 Gateway Timeout 错误的常见原因通常是 路由器超时包括:

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

常见诊断步骤

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

  • API 监控
  • NGINX 访问日志

API 监控

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

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

  1. 导航至分析 >API 监控 >调查页面。
  2. 过滤出 5xx 个错误,然后选择时间范围。
  3. 对照时间绘制状态代码
  4. 点击显示 504 个错误的具体单元格,查看更多详情 有关这些错误的日志,如下所示:

    显示 504 错误的示例

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

    流量日志窗口中,针对某些 504 错误,请注意以下详细信息:

    • Request:提供用于进行调用的请求方法和 URI
    • Response 时间:提供请求所用的总时间。

    在上面的示例中,

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

    您还可以使用 API Monitoring GET logs API。 例如,通过查询 orgenvtimeRange 的日志, 和 status,您可以下载符合以下条件的事务的所有日志: 客户端超时。

    由于 API Monitoring 将这些 504 的代理设置为 -(未设置) 您可以使用 API(日志 API)来获取虚拟主机和路径的关联代理。

    For example :

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

NGINX 访问日志

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

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

  1. 查看 NGINX 访问日志:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 搜索以查看在特定时间段内是否存在任何 504 错误 (如果问题在过去发生过)或者是否还有任何请求仍失败, 504
  3. 对于部分 504 错误,请注意以下信息: <ph type="x-smartling-placeholder">
      </ph>
    • 响应时间
    • 请求 URI

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

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

      <ph type="x-smartling-placeholder">
    • 请求GET /test-timeout
    • 主机别名myorg-test.apigee.net
  4. 检查请求时间是否与 I/O 超时相同 在路由器/虚拟主机上配置的 IP 地址。如果是,则表示路由器在 消息处理器未在此期间响应。

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

  5. 使用 Request 字段中的值相同。

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

诊断

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

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

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

<ph type="x-smartling-placeholder">
Edge 界面

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

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

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

Management API

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

  1. 执行 <ph type="x-smartling-placeholder"></ph> 获取虚拟主机 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 超时

<ph type="x-smartling-placeholder">
  1. 登录路由器机器。
  2. 在以下位置搜索属性 proxy_read_timeout/opt/nginx/conf.d 目录中,检查是否已使用新值设置该目录 如下所示:
    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_timeout0-default.conf 中的新值 57 已设置为 默认虚拟主机的配置文件。这表示 I/O 超时 在路由器上为 default 虚拟主机配置为 57 秒。如果您有 您会看到每个虚拟主机的信息。获取 针对您用于创建 API 的特定虚拟主机的 proxy_read_timeout 权限 调用失败,且返回 504 个错误。

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

您可以通过以下方式查看 I/O 超时:

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

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

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

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

    <Timeout>120000</Timeout>
    

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

<ph type="x-smartling-placeholder">
  1. 登录消息处理器。
  2. 在以下位置搜索属性 HTTPTransport.io.timeout.millis/opt/apigee/edge-message-processor/conf 目录中:

    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.millis55000 http.properties。这表示已成功将 I/O 超时配置为 55 秒。

确定路由器和消息处理器上配置的超时时间后,验证 与路由器/虚拟主机相比, 消息处理器/API 代理。

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

路由器超时(秒) 虚拟主机上的超时(以秒为单位) 消息处理器上的超时(秒) API 代理超时(秒)
57 - 55 120

这个句子中,

  • 默认值 57 秒在路由器上配置。
  • 特定虚拟主机上未设置超时值。也就是说,它会使用 默认值 57 秒。
  • 消息处理器上配置的默认值是 55 秒。
  • 但是,在特定 API 代理上,配置的值是 120 秒。

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

分辨率

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

  1. 请参阅 <ph type="x-smartling-placeholder"></ph> 配置 I/O 超时的最佳做法,以了解哪些超时值 应在通过 Apigee Edge 的 API 请求流中涉及的不同组件上设置。
  2. 在上例中,如果您确定需要设置更高的超时值, 因为后端服务器需要较长的时间,且您已延长超时时间, 设置为 120 秒,然后为 示例:在路由器上使用 123 seconds。为避免影响所有 API 代理 由于新的超时值,请仅在 123 seconds 特定虚拟主机
  3. 请按照 <ph type="x-smartling-placeholder"></ph> 配置路由器上的 I/O 超时以设置虚拟主机上的超时。