<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
视频
观看以下视频,详细了解如何解决 500 个内部服务器错误。
视频 | 说明 |
---|---|
简介 | 介绍 500 内部服务器错误及可能的原因。同时演示 实时 500 内部服务器错误,以及故障排除和解决步骤。 |
处理服务调用程序并提取变量错误 | 演示由服务调用程序和提取变量政策引起的两个 500 内部服务器错误 以及如何排查和解决这些错误。 |
处理 JavaScript 政策错误 | 显示由 JavaScript 政策导致的 500 内部服务器错误及相关步骤 以排查并解决此错误。 |
处理后端服务器故障 | 显示由后端服务器故障导致的 500 内部服务器错误示例并显示相关步骤 以解决错误。 |
问题
客户端应用将收到 HTTP 状态代码 500 以及消息 “内部服务器错误”作为对 API 调用的响应。500 内部服务器 错误可能是由在 Edge 中执行任何政策时出错或某个错误导致的, 在目标/后端服务器上完成。
HTTP 状态代码 500 是一般性的错误响应。这表示服务器遇到了 导致无法完成请求的意外情况。此错误通常是 由服务器返回。
错误消息
您可能会收到以下错误消息:
HTTP/1.1 500 Internal Server Error
在某些情况下,您可能会看到另一条包含更多详细信息的错误消息。下面是一个示例 错误消息:
{ "fault":{ "detail":{ "errorcode":"steps.servicecallout.ExecutionFailed" }, "faultstring":"Execution of ServiceCallout callWCSAuthServiceCallout failed. Reason: ResponseCode 400 is treated as error" } }
可能的原因
许多不同的原因都可能导致 500 内部服务器错误。在 Edge 中 根据错误发生的位置,错误原因可分为两大类:
原因 | 详细信息 | 我们针对以下情况提供了详细的问题排查步骤 |
边缘政策中存在执行错误 | 政策 可能会由于某种原因而失败。 | Edge 私有云和公有云用户 |
后端服务器出错 | 后端服务器可能会因某些原因而出现故障。 | Edge 私有云和公有云用户 |
边缘政策中存在执行错误
政策 API 代理可能会由于某种原因而失败。此部分介绍了出现以下情况时如何排查问题: 500 内部服务器错误发生在政策执行期间。
诊断
适用于私有云和公有云用户的诊断步骤
如果您有针对该错误的跟踪界面会话,则:
- 验证错误是否由执行政策导致。如需了解详情,请参阅确定问题的来源。
- 如果错误发生在政策执行期间,请继续...如果错误是由 请参阅后端服务器出错。
- 选择跟踪记录中失败且显示 500 Internal Server Error 的 API 请求。
- 检查请求,并选择失败的具体政策或名为 “错误”紧跟在跟踪记录中失败的政策之后。
- 查看“错误”部分,详细了解相应错误“属性”下方的 部分或错误内容。
- 根据您收集的有关错误的详细信息,尝试确定错误的原因。
仅适用于 Private Cloud 用户的诊断步骤
如果您没有轨迹界面会话,请执行以下操作:
- 验证错误是否发生在执行政策期间。如需了解详情,请参阅确定问题的来源。
- 如果错误是由执行政策导致的,请继续。如果在政策执行期间发生错误 执行,继续。如果错误是由后端服务器引起的,请参阅后端服务器出错。
- 按照确定 问题根源,以确定 API 代理中的失败政策以及 唯一请求消息 ID
- 检查消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
),然后搜索 唯一的请求消息 ID。 - 如果您找到了唯一的请求消息 ID,看看能否获取更多有关 以及导致失败的原因
分辨率
如果您已确定导致政策问题的原因,请尝试通过以下方式解决问题: 修正政策并重新部署代理。
以下示例说明了如何确定不同问题的原因和解决方法 问题类型。
如果您在排查 500 内部服务器错误方面需要进一步帮助,或者您怀疑 这表明是 Edge 中的问题,请联系 Apigee 支持。
示例 1:由于后端错误而导致服务调用程序政策失败 服务器
如果对后端服务器的调用根据服务调用程序政策失败,且出现任何此类错误, 作为 4XX 或 5XX,将被视为 500 内部服务器错误。
- 以下示例说明后端服务在服务内出现 404 错误而失败
宣传信息政策。系统会向最终用户发送以下错误消息:
{ "fault": { "detail": { "errorcode":"steps.servicecallout.ExecutionFailed" },"faultstring":"Execution of ServiceCallout service_callout_v3_store_by_lat_lon failed. Reason: ResponseCode 404 is treated as error" } } }
- 以下跟踪界面会话显示了由于服务错误导致的 500 状态代码 宣传信息政策:
- 在本示例中,“错误”属性列出了应用服务调用政策的原因 失败,因为“ResponseCode 404 被视为错误”。如果出现以下情况, 通过服务调用程序政策中的后端服务器网址访问的资源不是 可用。
- 检查后端服务器上的资源可用性。它可能不可用 或已移至其他位置。
示例 1 分辨率
- 检查后端服务器上的资源可用性。它可能不可用 或已移至其他位置。
- 修正服务调用程序政策中的后端服务器网址,使其指向一个有效的现有 资源。
- 如果资源只是暂时不可用,请在 资源可用。
示例 2:“提取变量”政策失败
现在我们来看另一个示例,其中由于某个错误而导致 500 Internal Server Error(500 内部服务器错误) ,并了解如何排查问题和解决问题。
- 由于“提取”中存在错误,界面会话中的以下跟踪记录显示了 500 状态代码 变量政策:
- 选择失败的“Extract Variables”政策,向下滚动并查看 "Error
内容"部分了解更多详情:
- 错误内容表示 "serviceCallout.oamCookieValidationResponse" 变量在 “提取变量”政策顾名思义,就是 对上述“服务调用程序”政策的响应。
- 选择跟踪记录中的“服务调用程序”政策,您可能会发现 "serviceCallout.oamCookieValidationResponse"变量。这个 表示对后端服务的调用失败,导致出现空响应 变量。
- 虽然服务调用程序政策已失败,但在 Service 之后执行政策
宣传信息政策继续有效,因为“continueOnError”标志设置
更改为 true,如下所示:
<ServiceCallout async="false" continueOnError="true" enabled="true" name="Callout.OamCookieValidation"> <DisplayName>Callout.OamCookieValidation</DisplayName> <Properties /> <Request clearPayload="true" variable="serviceCallout.oamCookieValidationRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </Request> <Response>serviceCallout.oamCookieValidationResponse</Response> <HTTPTargetConnection> <Properties /> <URL>http://{Url}</URL> </HTTPTargetConnection> </ServiceCallout>
- 请记下此特定 API 的唯一消息 ID“X-Apigee.Message-ID”"X-Apigee.Message-ID"
请求,如下所示:
<ph type="x-smartling-placeholder">
- </ph>
- 选择“记录的 Google Analytics 数据”阶段。
- 向下滚动并记下 X-Apigee.Message-ID 的值。
- 查看消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/system.log
),然后搜索 第 6 步中记下的邮件 ID。针对特定 API 观察到以下错误消息 请求:2017-05-05 07:48:18,653 org:myorg env:prod api:myapi rev:834 messageid:rrt-04984fed9e5ad3551-c-wo-32168-77563 NIOThread@5 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[C:]@149081 useCount=1 bytesRead=0 bytesWritten=0 age=3002ms lastIO=3002ms .onConnectTimeout connectAddress=mybackend.domain.com/XX.XX.XX.XX:443 resolvedAddress=mybackend.domain.com/XX.XX.XX.XX
上述错误表示服务调用程序政策因连接问题而失败 出现超时错误。
- 要确定连接超时错误的原因,请执行
telnet 命令。Telnet
命令显示“Connection timed out”(连接超时)错误,如下所示:
telnet mybackend.domain.com 443 Trying XX.XX.XX.XX... telnet: connect to address XX.XX.XX.XX: Connection timed out
通常,出现此错误的情况如下:
- 当后端服务器未配置为允许来自边缘消息的流量时 处理器。
- 如果后端服务器未在特定端口上进行监听。
在上图的示例中,虽然“提取变量”政策未通过,但实际 原因是 Edge 无法连接到服务调用中的后端服务器 政策。此故障的原因是后端服务器未配置为 允许来自边缘消息处理器的流量。
您自己的“提取变量”政策将有所不同,并且可能会因政策不同而失败 原因。您可以根据 提取变量政策,方法是查看错误 属性。
示例 2 分辨率
- 请在“提取变量”政策中适当修正错误或失败的原因。
- 在上面的说明示例中,解决方案是将网络配置修正为 允许从边缘消息处理器到后端服务器的流量。此操作由 将消息处理器加入许可名单特定后端服务器上的 IP 地址。例如: 那么可以使用 iptables 允许来自 后端服务器上消息处理器的 IP 地址。
示例 3:JavaCallout 政策失败
现在我们再看一个示例,其中由于某个错误而导致 500 Internal Server Error(500 内部服务器错误) ,并了解如何排查和解决问题。
- 以下界面跟踪记录显示由于 Java 调用程序政策错误而导致的 500 状态代码:
- 选择名为"Error"(错误)后跟失败的 Java 调用程序政策的流程 来获取错误详情,如下图所示:
- 在此示例中,“属性”部分下的 "error" 属性显示 失败原因是在连接到 Oracle 数据库时使用了过期的密码 调用 Java 调用程序您自己的 Java 调用程序的行为会有所不同, error 属性中填充不同的消息。
- 检查 JavaCallout 政策代码,并确认需要的正确配置 。
示例 3 分辨率
适当修复 Java 调用程序代码或配置,以避免运行时异常。在 如上图所示的 Java 调用程序失败示例,则需要使用正确的密码 以解决此问题。
后端服务器出错
后端服务器也可能出现 500 内部服务器错误。此部分 介绍了如何在错误来自后端服务器时排查问题。
诊断
所有用户的诊断步骤
其他后端错误的原因可能差别很大。您需要诊断每种情况 相互独立。
- 验证错误是否由后端服务器导致。如需了解详情,请参阅确定问题的来源。
- 如果错误是由后端服务器导致的,请继续操作。如果错误发生在 请参阅 Edge 执行错误 政策。
- 根据您是否有权访问 失败的 API;或者,如果后端是 Node.js 服务器:
如果失败的 API 调用没有对应的 Trace 会话:
- 如果界面跟踪记录不可用于失败的请求,请检查后端服务器 来获取关于错误的详细信息。
- 如果可能,请在后端服务器上启用调试模式,以获取有关 错误和原因。
如果您确实有针对失败的 API 调用的 Trace 会话:
如果您有 Trace 会话,那么以下步骤可帮助您诊断问题。
- 在跟踪工具中,选择失败且显示 500 Internal Server 的 API 请求 出错了。
- 从失败的阶段选择“Response received from target server”(从目标服务器收到响应)阶段 如下图所示的 API 请求:
- 请查看“响应内容”部分,详细了解错误。
- 在本例中,响应内容是 SOAP 信封,将故障字符串显示为 “未获授权”消息。造成这种情况的最可能原因 问题在于没有将正确的凭据(用户名/密码、访问令牌等) 发送到后端服务器若要解决此问题,请将正确的凭据传递给 后端服务器
如果后端是 Node.js 服务器:
- 如果后端是 Node.js 后端服务器,请查看 Node.js 日志
特定 API 代理的信息(公有云和私有云用户
查看 Node.js 日志)。如果您是 Edge Private Cloud 用户,
还可以查看你的消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 了解详情 错误消息。
Edge 界面中的 NodeJS 日志选项 - API 代理的“Overview”(概览)标签页
解决方法
- 确定错误原因后,请在后端服务器中修复问题。
- 如果是 Node.js 后端服务器:
<ph type="x-smartling-placeholder">
- </ph>
- 检查自定义代码是否抛出了错误,并尽可能修正问题。
- 如果您的自定义代码未抛出该错误,或者您需要帮助,请联系 Apigee 支持。
如果您在排查 500 内部服务器错误方面需要进一步帮助,或者您怀疑 这表明是 Edge 中的问题,请联系 Apigee 支持。
确定问题根源
使用以下某个过程来确定是否抛出了 500 内部服务器错误。 在 API 代理内或由后端服务器执行政策期间触发。
在界面中使用 Trace
注意:本部分中的步骤可以由公开和 Private Cloud 用户
- 如果问题仍存在,请在界面中为受影响的 API 启用跟踪记录。
- 捕获跟踪记录后,选择显示以下响应代码的 API 请求: 500。
- 遍历失败 API 请求的所有阶段,并检查返回哪个阶段 500 内部服务器错误: <ph type="x-smartling-placeholder">
使用 API 监控
注意:本部分中的步骤只能由公有云用户执行。
借助 API Monitoring,您可以快速分离问题领域,以诊断错误、性能和延迟问题及其来源。 例如开发者应用、API 代理、后端目标或 API 平台。
逐步执行示例场景,了解如何使用 API 监控来排查 API 的 5xx 问题。
例如,您可能希望设置提醒,以便在 500 个状态代码或 steps.servicecallout.ExecutionFailed
错误的数量超出特定阈值时收到通知。
使用 NGINX Access 日志
注意:本部分中的步骤适用于 Edge Private Cloud 用户 。
您还可以参考 NGINX 访问日志,确定是否抛出了 500 状态代码。 在 API 代理内或由后端服务器执行政策期间触发。这是 如果问题是以前发生的,或者问题是间歇性的,并且 无法在界面中捕获跟踪记录。按照以下步骤从订单中确定此信息 NGINX 访问日志:
- 查看 NGINX 访问日志 (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log
)。 - 搜索特定 API 代理在特定时间 时长。
- 如果存在任何 500 错误,请检查错误是政策错误还是目标服务器错误,
如下所示:
显示政策错误的示例条目
显示目标服务器错误的示例条目
- 确定是政策错误还是目标服务器错误后,请执行以下操作:
<ph type="x-smartling-placeholder">
- </ph>
- 如果遇到以下情况,请参阅边缘政策中的执行错误 则是政策错误。
- 如果是目标,则继续参阅后端服务器出错 服务器错误。