500 内部服务器错误

<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 内部服务器错误发生在政策执行期间。

诊断

适用于私有云和公有云用户的诊断步骤

如果您有针对该错误的跟踪界面会话,则:

  1. 验证错误是否由执行政策导致。如需了解详情,请参阅确定问题的来源
  2. 如果错误发生在政策执行期间,请继续...如果错误是由 请参阅后端服务器出错
  3. 选择跟踪记录中失败且显示 500 Internal Server Error 的 API 请求。
  4. 检查请求,并选择失败的具体政策或名为 “错误”紧跟在跟踪记录中失败的政策之后。
  5. 查看“错误”部分,详细了解相应错误“属性”下方的 部分或错误内容。
  6. 根据您收集的有关错误的详细信息,尝试确定错误的原因。

仅适用于 Private Cloud 用户的诊断步骤

如果您没有轨迹界面会话,请执行以下操作:

  1. 验证错误是否发生在执行政策期间。如需了解详情,请参阅确定问题的来源
  2. 如果错误是由执行政策导致的,请继续。如果在政策执行期间发生错误 执行,继续。如果错误是由后端服务器引起的,请参阅后端服务器出错
  3. 按照确定 问题根源,以确定 API 代理中的失败政策以及 唯一请求消息 ID
  4. 检查消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log),然后搜索 唯一的请求消息 ID。
  5. 如果您找到了唯一的请求消息 ID,看看能否获取更多有关 以及导致失败的原因

分辨率

如果您已确定导致政策问题的原因,请尝试通过以下方式解决问题: 修正政策并重新部署代理。

以下示例说明了如何确定不同问题的原因和解决方法 问题类型。

如果您在排查 500 内部服务器错误方面需要进一步帮助,或者您怀疑 这表明是 Edge 中的问题,请联系 Apigee 支持

示例 1:由于后端错误而导致服务调用程序政策失败 服务器

如果对后端服务器的调用根据服务调用程序政策失败,且出现任何此类错误, 作为 4XX 或 5XX,将被视为 500 内部服务器错误。

  1. 以下示例说明后端服务在服务内出现 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"
              }
         }
    }
    
  2. 以下跟踪界面会话显示了由于服务错误导致的 500 状态代码 宣传信息政策:

  3. 在本示例中,“错误”属性列出了应用服务调用政策的原因 失败,因为“ResponseCode 404 被视为错误”。如果出现以下情况, 通过服务调用程序政策中的后端服务器网址访问的资源不是 可用。
  4. 检查后端服务器上的资源可用性。它可能不可用 或已移至其他位置。

示例 1 分辨率

  1. 检查后端服务器上的资源可用性。它可能不可用 或已移至其他位置。
  2. 修正服务调用程序政策中的后端服务器网址,使其指向一个有效的现有 资源。
  3. 如果资源只是暂时不可用,请在 资源可用。

示例 2:“提取变量”政策失败

现在我们来看另一个示例,其中由于某个错误而导致 500 Internal Server Error(500 内部服务器错误) ,并了解如何排查问题和解决问题。

  1. 由于“提取”中存在错误,界面会话中的以下跟踪记录显示了 500 状态代码 变量政策:

  2. 选择失败的“Extract Variables”政策,向下滚动并查看 "Error 内容"部分了解更多详情:

  3. 错误内容表示 &quot;serviceCallout.oamCookieValidationResponse&quot; 变量在 “提取变量”政策顾名思义,就是 对上述“服务调用程序”政策的响应。
  4. 选择跟踪记录中的“服务调用程序”政策,您可能会发现 &quot;serviceCallout.oamCookieValidationResponse&quot;变量。这个 表示对后端服务的调用失败,导致出现空响应 变量。
  5. 虽然服务调用程序政策已失败,但在 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>
    
  6. 请记下此特定 API 的唯一消息 ID“X-Apigee.Message-ID”&quot;X-Apigee.Message-ID&quot; 请求,如下所示: <ph type="x-smartling-placeholder">
      </ph>
    1. 选择“记录的 Google Analytics 数据”阶段。
    2. 向下滚动并记下 X-Apigee.Message-ID 的值。

  7. 查看消息处理器日志 (/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
    

    上述错误表示服务调用程序政策因连接问题而失败 出现超时错误。

  8. 要确定连接超时错误的原因,请执行 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 分辨率

  1. 请在“提取变量”政策中适当修正错误或失败的原因。
  2. 在上面的说明示例中,解决方案是将网络配置修正为 允许从边缘消息处理器到后端服务器的流量。此操作由 将消息处理器加入许可名单特定后端服务器上的 IP 地址。例如: 那么可以使用 iptables 允许来自 后端服务器上消息处理器的 IP 地址。

示例 3:JavaCallout 政策失败

现在我们再看一个示例,其中由于某个错误而导致 500 Internal Server Error(500 内部服务器错误) ,并了解如何排查和解决问题。

  1. 以下界面跟踪记录显示由于 Java 调用程序政策错误而导致的 500 状态代码:

  2. 选择名为"Error"(错误)后跟失败的 Java 调用程序政策的流程 来获取错误详情,如下图所示:

  3. 在此示例中,“属性”部分下的 "error" 属性显示 失败原因是在连接到 Oracle 数据库时使用了过期的密码 调用 Java 调用程序您自己的 Java 调用程序的行为会有所不同, error 属性中填充不同的消息。
  4. 检查 JavaCallout 政策代码,并确认需要的正确配置 。

示例 3 分辨率

适当修复 Java 调用程序代码或配置,以避免运行时异常。在 如上图所示的 Java 调用程序失败示例,则需要使用正确的密码 以解决此问题。

后端服务器出错

后端服务器也可能出现 500 内部服务器错误。此部分 介绍了如何在错误来自后端服务器时排查问题。

诊断

所有用户的诊断步骤

其他后端错误的原因可能差别很大。您需要诊断每种情况 相互独立。

  1. 验证错误是否由后端服务器导致。如需了解详情,请参阅确定问题的来源
  2. 如果错误是由后端服务器导致的,请继续操作。如果错误发生在 请参阅 Edge 执行错误 政策
  3. 根据您是否有权访问 失败的 API;或者,如果后端是 Node.js 服务器:

如果失败的 API 调用没有对应的 Trace 会话

  1. 如果界面跟踪记录不可用于失败的请求,请检查后端服务器 来获取关于错误的详细信息。
  2. 如果可能,请在后端服务器上启用调试模式,以获取有关 错误和原因。

如果您确实有针对失败的 API 调用的 Trace 会话

如果您有 Trace 会话,那么以下步骤可帮助您诊断问题。

  1. 在跟踪工具中,选择失败且显示 500 Internal Server 的 API 请求 出错了。
  2. 从失败的阶段选择“Response received from target server”(从目标服务器收到响应)阶段 如下图所示的 API 请求:

  3. 请查看“响应内容”部分,详细了解错误。

  4. 在本例中,响应内容是 SOAP 信封,将故障字符串显示为 “未获授权”消息造成这种情况的最可能原因 问题在于没有将正确的凭据(用户名/密码、访问令牌等) 发送到后端服务器若要解决此问题,请将正确的凭据传递给 后端服务器

如果后端是 Node.js 服务器

  1. 如果后端是 Node.js 后端服务器,请查看 Node.js 日志 特定 API 代理的信息(公有云和私有云用户 查看 Node.js 日志)。如果您是 Edge Private Cloud 用户, 还可以查看你的消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 了解详情 错误消息。

    Edge 界面中的 NodeJS 日志选项 - API 代理的“Overview”(概览)标签页

解决方法

  1. 确定错误原因后,请在后端服务器中修复问题。
  2. 如果是 Node.js 后端服务器: <ph type="x-smartling-placeholder">
      </ph>
    1. 检查自定义代码是否抛出了错误,并尽可能修正问题。
    2. 如果您的自定义代码未抛出该错误,或者您需要帮助,请联系 Apigee 支持

如果您在排查 500 内部服务器错误方面需要进一步帮助,或者您怀疑 这表明是 Edge 中的问题,请联系 Apigee 支持

确定问题根源

使用以下某个过程来确定是否抛出了 500 内部服务器错误。 在 API 代理内或由后端服务器执行政策期间触发。

在界面中使用 Trace

注意:本部分中的步骤可以由公开和 Private Cloud 用户

  1. 如果问题仍存在,请在界面中为受影响的 API 启用跟踪记录。
  2. 捕获跟踪记录后,选择显示以下响应代码的 API 请求: 500。
  3. 遍历失败 API 请求的所有阶段,并检查返回哪个阶段 500 内部服务器错误: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果在执行政策期间抛出该错误,请前往边缘政策执行错误部分。
    2. 如果后端服务器返回了 500 内部服务器,则继续进行后端服务器出错

使用 API 监控

注意:本部分中的步骤只能由公有云用户执行。

借助 API Monitoring,您可以快速分离问题领域,以诊断错误、性能和延迟问题及其来源。 例如开发者应用、API 代理、后端目标或 API 平台。

逐步执行示例场景,了解如何使用 API 监控来排查 API 的 5xx 问题。 例如,您可能希望设置提醒,以便在 500 个状态代码或 steps.servicecallout.ExecutionFailed 错误的数量超出特定阈值时收到通知。

使用 NGINX Access 日志

注意:本部分中的步骤适用于 Edge Private Cloud 用户 。

您还可以参考 NGINX 访问日志,确定是否抛出了 500 状态代码。 在 API 代理内或由后端服务器执行政策期间触发。这是 如果问题是以前发生的,或者问题是间歇性的,并且 无法在界面中捕获跟踪记录。按照以下步骤从订单中确定此信息 NGINX 访问日志:

  1. 查看 NGINX 访问日志 (/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)。
  2. 搜索特定 API 代理在特定时间 时长。
  3. 如果存在任何 500 错误,请检查错误是政策错误还是目标服务器错误, 如下所示:

    显示政策错误的示例条目

    显示目标服务器错误的示例条目

  4. 确定是政策错误还是目标服务器错误后,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果遇到以下情况,请参阅边缘政策中的执行错误 则是政策错误。
    2. 如果是目标,则继续参阅后端服务器出错 服务器错误。