您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。 信息
视频
| 视频 | 说明 |
|---|---|
| 500 内部服务器错误 - 由后端引起 | 演示了由后端服务器引起的实时 500 Internal Server Error,以及用于排查和解决该错误的步骤。 |
问题
客户端应用会收到 HTTP 状态代码 500,并以消息 Internal Server Error 作为 API 调用的响应。
HTTP 状态代码 500 是一种通用错误响应。这意味着服务器遇到了意外情况,导致无法处理请求。当没有其他合适的错误代码时,服务器通常会返回此错误。
错误消息
客户端应用获取以下响应代码:
HTTP/1.1 500 Internal Server Error
此外,您可能会看到类似如下所示的错误消息:
示例 1
后端服务器响应示例 1
{"errorMessage":"Sorry either your e-mail or password didn't match.",
"errorParameters":"{}",
"errorCode":"500",
"errorKey":"INVALID_EMAILPASSWORD"}示例 2
示例后端服务器响应 #2
<Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <Error> <code>500</code> <message xml:lang="en-US">Not Authorised(e4138fa0-ec57).</message> </Error> </Body> </Envelope>
可能的原因
后端服务器可能会因多种原因返回 500 Internal Server Error。本策略方案介绍了如何使用常见步骤排查问题,并解决此错误(无论其原因是什么)。
此问题的可能原因如下:
| 原因 | 说明 | 适用的问题排查说明 |
|---|---|---|
| 后端服务器错误 | 后端服务器可能会因某些原因而发生故障。 | Edge Private Cloud 和 Public Cloud 用户 |
常见诊断步骤
您可以使用以下工具/方法来诊断此错误:
API 监控
方法 1:使用 API Monitoring
如需使用 API 监控功能诊断错误,请执行以下操作:
- 以具有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往分析 > API 监控 > 调查页面。
- 选择您发现错误的具体时间范围。
绘制故障代码与时间的对比图。
选择包含故障代码
messaging.adaptors.http.flow.ErrorResponseCode的单元格,如下所示:( 查看放大图片)

系统会显示有关故障代码
messaging.adaptors.http.flow.ErrorResponseCode的信息,如下所示:( 查看放大图片)

点击查看日志 ,然后展开失败请求对应的行。
( 查看放大图片)
- 在日志窗口中,记下以下详细信息:
- 请求消息 ID
- 状态代码:
500 - 故障来源:
target - 故障代码:
messaging.adaptors.http.flow.ErrorResponseCode
跟踪记录
程序 2:使用 Trace 工具
如需使用 Trace 工具诊断错误,请执行以下操作:
- 启用跟踪会话,并选择以下任一选项:
- 等待出现错误代码为
messaging.adaptors.http.flow.ErrorResponseCode的500 Internal Server Error错误,或 - 如果您可以重现问题,请进行 API 调用以重现问题
500 Internal Server Error
- 等待出现错误代码为
确保已启用显示所有 FlowInfo:

- 选择一个失败的请求,然后检查轨迹。
- 浏览轨迹的不同阶段,找到发生故障的位置。
您通常会在“从目标服务器收到响应”阶段之后的流程中发现错误,如下所示:
( 查看放大图片)

- 在轨迹中找到 AX(记录的分析数据)阶段,然后点击它。
向下滚动到阶段详细信息响应标头部分,确定 X-Apigee-fault-code、X-Apigee-fault-source 和 X-Apigee-Message-ID 的值,如下所示:
( 查看放大图片)

- 请注意 X-Apigee-fault-code、X-Apigee-fault-source 和 X-Apigee-Message-ID 的值:
| 响应标头 | 值 |
|---|---|
| X-Apigee-fault-code | messaging.adaptors.http.flow.ErrorResponseCode |
| X-Apigee-fault-source | target |
| X-Apigee-Message-ID | MESSAGE_ID |
NGINX
程序 3:使用 NGINX 访问日志
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 NGINX 访问日志来确定有关 HTTP
500 Internal Server Error的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 搜索以查看在特定时长内(如果问题发生在过去)是否存在任何错误代码为
messaging.adaptors.http.flow.ErrorResponseCode的500错误,或者是否仍有任何请求失败并显示500。 如果您发现任何
500错误,且 X-Apigee-fault-code 与messaging.adaptors.http.flow.ErrorResponseCode的值匹配,请确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 500 错误示例:
( 查看放大图片)
上述 NGINX 访问日志中的示例条目具有以下 X-Apigee-fault-code 和 X-Apigee-fault-source 值:
标头 值 X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCodeX-Apigee-fault-source target
原因:后端服务器出错
诊断
后端服务器返回的 500 Internal Server Error 可能由多种原因导致。您需要单独诊断每种情况。
- 使用 API Monitoring、Trace 工具或 NGINX 访问日志(如常见诊断步骤中所述)确定所观察到的错误的故障代码、故障来源。
- 如果 Fault Source 为
target且 Fault Code 为messaging.adaptors.http.flow.ErrorResponseCode,则表示该错误是由后端服务器返回的。 - 您可以使用以下步骤之一来诊断问题的原因:
跟踪记录
使用 Trace:
如果您有失败的跟踪会话,请执行以下步骤:
- 在轨迹中,选择失败的 API 请求(带有
500 Internal Server Error)。 从失败的 API 请求中选择从目标服务器收到的响应阶段,如下图所示:
( 查看放大图片)
向下滚动到 Phase Details 部分,然后检查包含后端服务器响应的 Response Content。
示例回答内容:
<Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <Error> <code>500</code> <message xml:lang="en-US">Not Authorised(e4138fa0-ec57).</message> </Error> </Body> </Envelope>
在上述响应中,请注意后端服务器的错误消息为 Not Authorised。这表示用户可能传递了无效的凭据,因此才会收到此错误。
调用后端服务器
直接调用后端服务器:
您可以直接调用后端服务器并执行以下操作:
- 验证您是否获得了与通过 Apigee Edge 发出请求时收到的相同的
500 Internal Server Error响应 - 检查从后端服务器收到的错误消息(响应)
执行以下步骤,直接调用后端服务器:
- 确保您拥有所有必需的标头、查询参数以及需要作为请求的一部分传递给后端服务器的任何凭据。
- 如果后端服务可公开访问,则可以使用
curl命令、Postman 或任何其他 REST 客户端直接调用后端服务器 API。 如果后端服务器只能从消息处理器访问,那么您可以使用
curl命令、Postman 或任何其他 REST 客户端,并直接从消息处理器调用后端服务器 API。- 验证后端服务是否确实返回
500 Internal Server Error,检查后端服务器返回的错误消息(响应),并确定此错误的原因。
后端服务器日志
使用后端服务器日志
- 查看后端服务器日志,尝试获取有关该错误及其原因的更多详细信息。
- 如果可能,请在后端服务器上启用调试模式,以详细了解错误和原因。
- 在轨迹中,选择失败的 API 请求(带有
检查您是否在发生故障的 API 代理的特定目标端点中使用了 代理链;也就是说,目标服务器/目标端点是否在 Apigee Edge 中调用了另一个代理。如需确定这一点,请执行以下操作:
如果您有失败请求的轨迹,请前往发送到目标服务器的请求阶段,然后点击显示 Curl。
- 系统会打开 Curl for Request Sent to Target Server(发送到目标服务器的请求的 Curl)窗口,您可以在其中确定目标服务器主机别名。
- 检查 API 代理的目标端点,并查看目标服务器中的后端服务器网址或主机名是否指向其他代理或您自己的后端服务器。
- 如果目标服务器主机别名指向虚拟主机别名,则为代理链。在这种情况下,您需要针对链式代理重复执行上述所有步骤,直到确定实际导致
500 Internal Server Error的原因。在这些情况下,500 Internal Server Error也可能发生在其他阶段的其他链式代理中,可以使用此剧本或 500 内部服务器错误剧本中提供的说明来诊断和解决。 - 如果目标服务器主机别名指向您的后端服务器,请前往问题解决。
分辨率
如果确定 500 错误来自后端服务器,请与后端服务器团队合作,妥善解决此问题。
在上述示例中,您可能需要请求用户传递有效的凭据来解决此问题。
注意事项
- 只有在捕获失败请求的跟踪会话后,您才能查看后端服务器针对
500 Internal Server Error返回的实际错误消息。 - 出于安全考虑,后端服务器响应不会记录在 API 监控、NGINX 访问日志或消息处理器日志中。
- 您可以查看后端服务器日志或在后端启用调试模式,以详细了解
500 Internal Server Error,并/或查看后端服务器返回的错误消息。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后联系 Apigee Edge 支持团队。
如果您是公共云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 用于重现
500错误的完整curl命令 - 包含带
500 Internal Server Error的请求的轨迹文件 - 如果目前未发生
500错误,请提供过去发生500错误的时间段,并附上时区信息。
如果您是私有云用户,请提供以下信息:
- 失败请求的完整错误消息
- 您正在观察
500错误的组织、环境名称和 API 代理名称 - API 代理软件包
- 包含带
500 Internal Server Error的请求的轨迹文件 - NGINX 访问日志
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log其中: ORG、ENV 和 PORT# 会替换为实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log - 发生
500错误的时间段(包含时区信息)。