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