您正在查看的是 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 诊断错误,请执行以下操作:
- 前往 Analyze > API Monitoring > Investigate 页面。
- 过滤出
5xx
个错误,然后选择时间范围。 - 根据时间绘制状态代码。
-
点击显示
504
错误的特定单元格,以了解更多详情和有关这些错误的日志,如下所示:显示 504 错误的示例
- 在右侧窗格中,点击查看日志。
在流量日志窗口中,请注意部分
504
错误的以下详细信息:- 请求:此属性提供用于进行调用的请求方法和 URI
- 响应时间:此字段提供请求所用的总时间。
在上面的示例中,
- 请求 指向
GET /test-timeout
。 - 响应时间 为
57.001
秒。这表示在消息处理器可以响应之前,路由器已超时,因为该值非常接近路由器上设置的默认 I/O 超时时间(即 57 秒)。
您还可以使用 API Monitoring GET Logs API 来获取所有日志。例如,通过查询
org
、env
、timeRange
和status
的日志,您可以下载客户端超时的事务的所有日志。由于 API Monitoring 会针对这些
504
错误将代理设置为-
(未设置),因此您可以使用 API (Logs API) 获取虚拟主机和路径的关联代理。For example :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- 检查响应时间是否存在其他
504
错误,并检查所有504
错误的响应时间是否一致(在路由器上设置的 I/O 超时值为 57 秒)。
NGINX 访问日志
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜索以查看在特定时间段内是否存在任何
504
错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示504
。 - 请注意部分
504
错误的以下信息:- 响应时间
- Request URI
在此示例中,我们会看到以下信息:
-
请求时间:
57.001
秒。这表示路由器在 57.001 秒后超时。 - 请求:
GET /test-timeout
- Host Alias(主机别名):
myorg-test.apigee.net
-
检查请求时间是否与路由器/虚拟主机上配置的 I/O 超时相同。如果是,则表示路由器超时,然后消息处理器在此时间段内未响应。
在上面显示的 NGINX 访问日志条目示例中,
57.001
秒的请求时间与路由器上设置的默认 I/O 超时非常接近。这清楚地表示路由器在消息处理器可以响应前超时了。 - 使用请求 字段中的基础路径来确定哪个 API 代理是发出请求的。
原因:路由器上的超时配置不正确
诊断
- 确定
504
错误是否是由路由器在消息处理器返回响应前已超时导致的。为此,您可以使用 API Monitoring 或 NGINX Access Common 诊断步骤查看 API Monitoring 中的 API Monitoring 中的 Response Time/路由器中的 Request Time 中的响应时间(这两个字段代表的信息相同,但调用的名称不同)是否与路由器/虚拟主机上配置的 I/O 超时相同,以及 Fault Source、Fault Proxy 和 Fault Code 字段是否设置为-
。 -
检查在路由器或特定虚拟主机上配置的 I/O 超时值是否低于在消息处理器或特定 API 代理上配置的 I/O 超时值。
您可以按照本部分中的步骤进行操作。
验证虚拟主机上的 I/O 超时
Edge 界面
如需使用 Edge 界面验证虚拟主机超时情况,请执行以下操作:
- 登录 Edge 界面。
- 依次访问管理 > 虚拟主机。
- 选择您遇到超时问题的特定环境。
- 选择您要验证 I/O 超时值的特定虚拟主机。
- 在属性下,查看代理读取超时值(以秒为单位)。
在上述示例中,代理读取超时 被配置为值
120
。这意味着此虚拟主机上配置的 I/O 超时为 120 秒。
Management API
您也可以使用以下管理 API 验证代理读取超时:
-
执行 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 是虚拟主机的名称
-
检查为属性“
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 超时
- 登录路由器机器。
- 在
/opt/nginx/conf.d
目录中搜索属性proxy_read_timeout
,并检查它是否已使用新值进行设置,如下所示:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
请检查在特定虚拟主机配置文件中为属性
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 超时
- 在 Edge 界面中,选择要查看 I/O 超时值的具体 API 代理。
- 选择您要检查的特定目标端点。
- 在
TargetEndpoint
配置中的<HTTPTargetConnection>
元素下查看具有适当值的属性io.timeout.millis
。例如,以下代码中的 I/O 超时设置为 120 秒:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
在 API 代理的 ServiceCallout 政策中查看 I/O 超时
- 在 Edge 界面中,选择要在哪个特定 API 代理中查看 ServiceCallout 政策的新 I/O 超时值。
- 选择您要查看的具体 ServiceCallout 政策。
-
请参阅
<ServiceCallout>
配置下具有适当值的元素<Timeout>
。例如,以下代码的 I/O 超时为 120 秒:
<Timeout>120000</Timeout>
验证消息处理器上的 I/O 超时
- 登录消息处理器机器。
-
使用以下命令在
/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
- 在上面的示例输出中,请注意
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 超时。
- 请参阅 配置 I/O 超时的最佳做法,了解 Apigee Edge 的 API 请求流中涉及的不同组件应该设置哪些超时值。
- 在上述示例中,如果您确定需要设置更高的超时值(因为后端服务器需要更长的时间),并且已将消息处理器的超时值增加到 120 秒,则设置更高的超时值。例如:路由器上的
123 seconds
。为避免因新的超时值而影响所有 API 代理,请仅在特定 API 代理中使用的特定虚拟主机上设置123 seconds
的值。 - 按照 在路由器上配置 I/O 超时中的说明,在虚拟主机上设置超时。