您正在查看的是 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 和公有云用户 |
常见诊断步骤
使用以下工具/技巧之一来诊断此错误:
API 监控
过程 1:使用 API 监控
要使用 API Monitoring 诊断错误,请执行以下操作:
- 以拥有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往 Analyze > API Monitoring > Investigate 页面。
- 选择您发现错误的具体时间范围。
根据时间绘制故障代码。
选择具有错误代码
messaging.adaptors.http.flow.ErrorResponseCode
的单元格,如下所示:( 查看大图)
错误代码
messaging.adaptors.http.flow.ErrorResponseCode
的相关信息如下所示:( 查看大图)
点击查看日志 ,然后展开失败请求所在的行。
( 查看大图)
- 在日志窗口中,请注意以下详细信息:
- 请求消息 ID
- 状态代码:
500
- 错误来源:
target
- 错误代码:
messaging.adaptors.http.flow.ErrorResponseCode
跟踪记录
过程 2:使用跟踪工具
如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话,然后:
- 等待发生
500 Internal Server Error
错误(错误代码为messaging.adaptors.http.flow.ErrorResponseCode
),或者 - 如果您可以重现问题,请进行 API 调用以重现问题
500 Internal Server Error
- 等待发生
确保已启用 Show all FlowInfos:
- 选择其中一个失败的请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段,并找到失败的位置。
通常,您会在从目标服务器收到响应阶段之后的流程中发现该错误,如下所示:
( 查看大图)
- 进入跟踪记录中的 AX(已记录 Google Analytics(分析)数据)阶段,然后点击该阶段。
向下滚动到 Phase Details Response Headers(阶段详细信息响应标头)部分,并确定 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 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 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 与 X-Apigee-fault-code 的值匹配,则确定 X-Apigee-fault-code 的值。NGINX 访问日志中的 500 错误示例:
( 查看大图)
NGINX 访问日志中的上述示例条目具有 X-Apigee-fault-code 和 X-Apigee-fault-code 的以下值:
标头 值 X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
X-Apigee-fault-source target
原因:后端服务器出错
诊断
有很多原因会导致后端服务器响应的 500 Internal Server Error
。您需要分别诊断每种情况。
- 按照常见诊断步骤中所述,使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的错误代码、故障来源。
- 如果故障来源为
target
且故障代码为messaging.adaptors.http.flow.ErrorResponseCode
,则表示后端服务器返回了错误。 - 您可以使用以下任一步骤来诊断问题的原因:
跟踪记录
使用 Trace:
如果您有失败情况的跟踪会话,请执行以下步骤:
- 在 Trace 中,选择因
500 Internal Server Error
而失败的 API 请求。 从失败的 API 请求中选择从目标服务器接收到的响应阶段,如下图所示:
( 查看大图)
向下滚动到阶段详细信息部分,并检查响应内容,其中包含来自后端服务器的响应。
响应内容示例:
<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 Authoried。这表示用户传递的凭据可能无效,这就是为什么会收到此错误。
调用后端服务器
直接调用后端服务器:
您可以直接调用后端服务器,并执行以下操作:
- 验证您收到的
500 Internal Server Error
响应是否与通过 Apigee Edge 发出请求时收到的响应相同 - 检查从后端服务器收到的错误消息(响应)
如需直接调用后端服务器,请执行以下步骤:
- 确保您拥有所有必需的标头、查询参数以及需要作为请求的一部分传递给后端服务器的任何凭据。
- 如果后端服务可公开访问,那么您可以使用
curl
命令、Postman 或任何其他 REST 客户端直接调用后端服务器 API。 如果只能从消息处理器访问后端服务器,您可以使用
curl
命令、Postman 或任何其他 REST 客户端,并直接从消息处理器调用后端服务器 API。- 验证后端服务是否确实返回
500 Internal Server Error
,并检查后端服务器返回的错误消息(响应),并确定此错误的原因。
后端服务器日志
使用后端服务器日志
- 查看后端服务器日志,并尝试获取有关错误及其原因的更多详细信息。
- 如果可能,请在后端服务器上启用调试模式,以获取关于错误和原因的更多详细信息。
- 在 Trace 中,选择因
检查是否在出现故障的 API 代理的特定目标端点(即目标服务器/目标端点正在调用 Apigee Edge 中的其他代理)中使用 代理链接。要确定这一点,请执行以下操作:
如果您有失败请求的跟踪记录,请转到 Request sent to target server 阶段,然后点击 Show Curl。
- 此时将打开 Curl for Request Sent to Target Server 窗口,您可以从中确定目标服务器主机别名。
- 查看 API 代理的目标端点,检查后端服务器网址或目标服务器中的主机名是否指向其他代理或您自己的后端服务器。
- 如果目标服务器主机别名指向虚拟主机别名,则它是代理链。在这种情况下,您需要对链式代理重复上述所有步骤,直到确定导致
500 Internal Server Error
的实际原因。在这些情况下,500 Internal Server Error
可能会在其他阶段的其他链式代理中发生,您可以按照本手册或 500 内部服务器错误手册中的说明诊断和解决这些错误。 - 如果目标服务器主机别名指向您的后端服务器,请转到解决。
分辨率
如果确定 500
错误来自后端服务器,请与您的后端服务器团队合作,妥善解决问题。
在上述示例中,您可能需要要求用户传递有效凭据才能解决此问题。
需要注意的要点
- 仅当您捕获失败请求的跟踪会话后,才能查看后端服务器针对
500 Internal Server Error
返回的实际错误消息。 - 出于安全考虑,后端服务器响应不会记录在 API 监控、NGINX 访问日志或消息处理器日志中。
- 您可以查看后端服务器日志或在后端启用调试模式,以获取关于
500 Internal Server Error
的更多详细信息和/或查看后端服务器返回的错误消息。
必须收集的诊断信息
如果按照上述说明操作后,问题仍然存在,请收集以下诊断信息并联系 Apigee Edge 支持团队。
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成
curl
命令以重现500
错误 - 包含带有
500 Internal Server Error
的请求的跟踪文件 - 如果
500
错误当前没有发生,请提供过去发生500
错误时的时区信息对应的时间段。
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 您观察到
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
错误时包含时区信息的时间段。