500 Internal Server Error - バックエンド サーバー

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します。
info

動画

動画 説明
500 Internal Server Error - バックエンドが原因 バックエンド サーバーが原因で発生したリアルタイムの 500 Internal Server Error と、エラーのトラブルシューティングと解決の手順を示します。

症状

API 呼び出しのレスポンスで、クライアント アプリケーションが HTTP ステータス コード 500、「 Internal Server Error」 というメッセージを受け取ります。

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 Monitoring

手順 1: API Monitoring を使用する

API Monitoring を使用してエラーを診断するには:

  1. 適切なロールを持つユーザーで Apigee Edge UIにログインします。
  2. 問題を調査する組織に切り替えます。

  3. [分析] > [API Monitoring] > [調査] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. [障害コード] を [時間] に対してプロットします。

  6. 次のように、障害コード messaging.adaptors.http.flow.ErrorResponseCode を含むセルを選択します。

    ( 大きい画像を表示)

  7. 次のように、障害コード messaging.adaptors.http.flow.ErrorResponseCode に関する情報が表示されます。

    ( 大きい画像を表示)

  8. [ログを表示 ] をクリックして、失敗したリクエストの行を展開します。

    ( 大きい画像を表示)

  9. [ログ] ウィンドウで、次の情報をメモします。
    • リクエスト メッセージ ID
    • ステータス コード: 500
    • 障害ソース: target
    • 障害コード: messaging.adaptors.http.flow.ErrorResponseCode

トレース

手順 2: Trace ツールを使用する

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションを有効にして、次のいずれかを行います。
    • エラーコード messaging.adaptors.http.flow.ErrorResponseCode の 500 Internal Server Error エラーが発生するまで待つか、
    • 問題を再現できる場合は、API 呼び出しを行って問題を再現します 500 Internal Server Error
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストのいずれかを選択して、トレースを調べます。
  4. トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
  5. 通常、エラーは次のように [Response received from target server] フェーズの後のフローにあります。

    ( 大きい画像を表示)

  6. トレースの [AX](アナリティクス データが記録された)フェーズに移動してクリックします。
  7. [Phase Details Response Headers] セクションまでスクロールし、次のように X-Apigee-fault-code、X-Apigee-fault-source、X-Apigee-Message-ID の値を特定します。

    ( 大きい画像を表示)

  8. X-Apigee-fault-code、X-Apigee-fault-source、X-Apigee-Message-ID の値をメモします。
  9. レスポンス ヘッダー 値
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

手順 3: NGINX アクセスログを使用する

NGINX アクセスログを使用してエラーを診断するには:

  1. Private Cloud ユーザーの場合は、NGINX アクセスログを使用して HTTP 500 Internal Server Error に関する重要な情報を特定できます。
  2. NGINX アクセスログを確認します。

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. 特定の期間(過去に問題が発生した場合)にエラーコード messaging.adaptors.http.flow.ErrorResponseCode の 500 エラーが発生しているかどうか、または 500 で失敗しているリクエストがまだあるかどうかを検索します。
  4. X-Apigee-fault-code が messaging.adaptors.http.flow.ErrorResponseCode の値と一致する 500 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    NGINX アクセスログからの 500 エラーのサンプル:

    ( 大きい画像を表示)

    NGINX アクセスログの上記のサンプル エントリには、 X-Apigee-fault-code と X-Apigee-fault-source: の次の値が含まれています。

    ヘッダー 値
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
    X-Apigee-fault-source target

原因: バックエンド サーバーのエラー

診断

バックエンド サーバーから返される 500 Internal Server Error は、さまざまな理由で発生する可能性があります。それぞれの状況で個別に診断することが必要になります。

  1. 共通の診断手順で説明したように、API Monitoring、 Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード、障害ソース を特定します。
  2. 障害ソース が target で、障害コード が messaging.adaptors.http.flow.ErrorResponseCode の場合、エラーはバックエンド サーバーから返されます。
  3. 次のいずれかの手順で、問題の原因を診断できます。

    トレース

    トレースを使用する:

    失敗のトレース セッションがある場合は、次の手順を行います。

    1. トレースで、 500 Internal Server Error で失敗した API リクエストを選択します。
    2. 次の図のように、失敗している API リクエストで [Response received from target server] フェーズを選択します。

      ( 大きい画像を表示)

    3. [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 レスポンスが返されるかどうかを確認する
    • バックエンド サーバーから受信したエラー メッセージ(レスポンス)を確認する

    バックエンド サーバーを直接呼び出すには、次の手順を行います。

    1. 必要なヘッダー、クエリ パラメータ、リクエストの一部としてバックエンド サーバーに渡す必要がある 認証情報がすべて揃っていることを確認します。
    2. バックエンド サービスに一般公開されている場合は、 curl コマンド、Postman、その他の REST クライアントを使用して、 バックエンド サーバー API を直接呼び出すことができます。
    3. バックエンド サーバーに Message Processor からのみアクセスできる場合は、 curl コマンド、Postman、その他の REST クライアントを使用して、 バックエンド サーバー API を Message Processor から直接呼び出すことができます。

    4. バックエンド サービスが実際に 500 Internal Server Error を返しているかどうかを確認し、バックエンド サーバーから返されたエラー メッセージ(レスポンス)を確認して、 このエラーの原因を特定します。

    バックエンド サーバーログ

    バックエンド サーバーログを使用する

    1. バックエンド サーバーログを確認し、エラーとその原因に関する詳細情報を取得します。
    2. 可能であれば、バックエンド サーバーでデバッグモードを有効にして、エラーと原因に関するさらに詳細な情報を取得します。
  4. 失敗した API プロキシの特定のターゲット エンドポイントで プロキシ チェーンを使用しているかどうかを確認します。 つまり、ターゲット サーバーまたはターゲット エンドポイントが Apigee Edge で別のプロキシを呼び出しているかどうかを確認します。これを確認するには:

    1. 失敗したリクエストのトレースがある場合は、[Request sent to target server] フェーズに移動して [Show Curl] をクリックします。

    2. [Curl for Request Sent to Target Server] ウィンドウが開き、ターゲット サーバーのホスト エイリアスを特定できます。
    3. API プロキシのターゲット エンドポイントを確認し、ターゲット サーバーのバックエンド サーバー URL またはホスト名が別のプロキシまたは独自の バックエンド サーバーを指しているかどうかを確認します。
    4. ターゲット サーバーのホスト エイリアスが仮想ホスト エイリアスを指している場合は、プロキシ チェーンです。この場合は、 チェーンされたプロキシに対して上記の手順をすべて繰り返すまで、実際の問題の原因を特定する必要があります500 Internal Server Error。このような場合、500 Internal Server Error は、他のチェーンされたプロキシの他のステージでも発生する可能性があります。このエラーは、このプレイブックまたは 500 Internal Server Error プレイブックに記載されている手順を使用して診断して解決できます。
    5. ターゲット サーバーのホスト エイリアスがバックエンド サーバーを指している場合は、 解決策に進みます。

解決策

500 エラーがバックエンド サーバーから発生していることが判明した場合は、 バックエンド サーバー チームと協力して問題を適切に修正してください。

上記で説明した例では、この問題を解決するために、ユーザーに有効な認証情報を渡すようにリクエストする必要がある場合があります。

留意事項

  1. 500 Internal Server Error に対してバックエンド サーバーから返される実際のエラー メッセージは、失敗した リクエストのトレース セッションをキャプチャした場合にのみ表示できます。
  2. セキュリティ上の理由から、バックエンド サーバーのレスポンスは API Monitoring、NGINX アクセスログ、または Message Processor ログに記録されません。
  3. バックエンド サーバーログを確認するか、バックエンドでデバッグモードを有効にすると、 詳細情報を取得したり、500 Internal Server Errorバックエンド サーバーから返されたエラー メッセージを表示したりできます。

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の 診断情報を収集してApigee Edge サポートにお問い合わせください。

Public Cloud ユーザーの場合は、次の情報を提供してください。

  • 組織名
  • 環境名
  • API プロキシ名
  • 500 エラーを再現するための完全な curl コマンド
  • 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# は実際の値に置き換えます。

  • Message Processor システムログ /opt/apigee/var/log/edge-message-processor/logs/system.log
  • 500 エラーが発生した期間とタイムゾーン情報。