HTTP Connector のトラブルシューティング - Mule 4

Anypoint Connector for HTTP (HTTP Connector) をトラブルシューティングするには、ワイヤロギングおよび TLS デバッグを有効にして、​Host​ ヘッダーおよび HTTP エンコーディングを適切に使用するようにして、よくスローされるメッセージについて理解しておきます。

ワイヤロギングを有効化する

ワイヤロギングを有効にしてアプリケーションのパフォーマンスのトラブルシューティングを行うと、アプリケーションワークフローの実際の未加工 HTTP 要求および応答がログに記録されます。その後、そのログを使用して現在の設定を検証するか、HTTP Connector の動作を他のクライアントやサーバと比較します。

HTTP ワイヤロギングを有効化する手順は、次のとおりです。

  1. Anypoint Studio にアクセスし、​[Package Explorer]​ ビューに移動します。

  2. アプリケーションのプロジェクトを開きます。

  3. src/main/resources​ パスフォルダを開きます。

  4. フォルダ内の ​log4j2.xml​ ファイルを開きます。

  5. 次の行がすでに ​log4j2.xml​ ファイル内にある場合は、そのコメントを解除して有効にします。それ以外の場合、次の行を追加します。

    <?xml version="1.0" encoding="utf-8"?>
    <Configuration>
        ...
        <Loggers>
            ...
            <!-- Http Logger shows wire traffic on DEBUG. -->
            <AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG"/>
            ...
        </Loggers>
    </Configuration>
  1. 変更を保存します。

  2. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

TLS デバッグの有効化

TLS デバッグを有効にして SSL 障害のトラブルシューティングを行うと、接続試行、ハンドシェイク、ネゴシエーションなどの SSL 関連のデータがログに記録されます。

その後、そのログを使用して、正しい証明書が揃っているか、なぜ暗号化やプロトコルの不一致が起きているのか、なぜ接続が失敗するのかなどを判断します。

TLS デバッグを有効にするには、システムプロパティ ​-Djavax.net.debug=ssl​ を設定します。

Host ヘッダーの誤使用のトラブルシューティング

HTTP クライアントでは、​Host​ ヘッダーを使用して要求されたリソースのホストとポート番号を示します。HTTP Connector の ​Request​ 操作では、設定されたホストとポートを考慮するこの必須のヘッダーを自動生成します。ただし、サーバではポート情報を省略可能とみなすことが多くあり、ポート情報が含まれる要求を受信するとエラーになります。

こうしたエラーはサーバ所有者に報告して修正を依頼してください。修正されるまでの間は、ポート情報を含めずに ​Host​ ヘッダーを出力するように ​Request​ 操作を手動で変更して、この問題を回避してください。

次の例は、​Host: somehost.com​ ヘッダーを送信する ​<http:headers>​ 設定を示しています。

<flow name="connectingToFaultyServer">
  <http:request method="GET" url="http://somehost.com:8081/api/v3/someresource">
    <http:headers>
      #[{"Host" : "somehost.com"}]
    </http:headers>
  </http:request>
  <logger level="INFO"
   message="#['Received a ' ++ attributes.status code ++ ' response with body: {' ++ payload ++ '}']"/>
</flow>

明示的なヘッダー設定がないと、自動生成された ​Host: somehost.com:8081​ が送信されます。

HTTP エンコードのトラブルシューティング

ストリーミングされたデータを処理する時のパフォーマンスを向上させるために、HTTP Connector では送信するデータのサイズが不明な場合に ​Transfer-Encoding: chunked​ エンコードを使用して要求および応答を送信します。ただし、HTTP クライアントおよびサーバがこうしたデータを受信する準備ができていない場合があります。

こうしたエラーはサーバ所有者またはクライアント所有者に報告して修正を依頼してください。修正されるまでの間は、​Content-Length​ でエンコードされた本文を出力するように ​Listener​ 操作および ​Request​ 操作を手動で変更して、この問題を回避してください。

次の例は、​Content-Length​ エンコードを使用することを示す ​responseStreamingMode​ ​NEVER​ を使用して設定された HTTP の ​Listener​ 操作を示しています。

<flow name="main-contact-read">
  <http:listener path="account/{accountId}/main-contact" allowedMethods="GET" responseStreamingMode="NEVER" config-ref="HTTP_Listener_config"/>
  <!-- fetch main contact for accountId -->
</flow>

次の例は、​Content-Length​ エンコードを使用するために ​requestStreamingMode​ ​NEVER​ を使用して設定された HTTP の ​Requester​ 操作を示しています。

<flow name="connectingToFaultyServer">
  <http:request method="GET" url="http://somehost.com:8081/api/v3/someresource" requestStreamingMode="NEVER"/>
  <logger level="INFO"
   message="#['Received a ' ++ attributes.status code ++ ' response with body: {' ++ payload ++ '}']"/>
</flow>

一般的なスローの理解

ここでは、一般的なスローメッセージとその解決方法を示します。

  • HTTP:BAD_REQUEST

    たとえばヘッダーサイズが最大値を超えている場合に、構文が無効であるためサーバが要求を理解できません。
  • HTTP:CLIENT_SECURITY

    外部エンティティによって適用されたセキュリティの問題が発生しました。
  • HTTP:CONNECTIVITY

    A problem occurred and a connection could not be established. (問題が発生して接続を確立できませんでした。)
  • HTTP:FORBIDDEN

    クライアントにコンテンツへのアクセス権がないため、サーバが要求されたリソースの提供を拒否しています。
  • HTTP:INTERNAL_SERVER_ERROR

    サーバで要求を満たせない状況が発生しました。
  • HTTP:METHOD_NOT_ALLOWED

    サーバの要求メソッドが対象リソースでサポートされていません。
  • HTTP:NOT_ACCEPTABLE

    サーバが要求のプロアクティブコンテンツネゴシエーションヘッダーで定義された許容可能な値のリストに一致する応答を生成できません。
  • HTTP:NOT_FOUND

    The server could not find the requested resource. (サーバは要求されたリソースを見つけることができませんでした。)
  • HTTP:PARSING

    [非推奨ですが、互換性を確保するために保持されています。]解析メカニズムが削除されました。
  • HTTP:RETRY_EXHAUSTED

    The maximum number of retries for the operation is reached. (操作の最大試行回数に達しました。)
  • HTTP:SECURITY

    リクエスタ認証に失敗しました。
  • HTTP:SERVICE_UNAVAILABLE

    サーバはメンテナンスまたは過負荷のためにダウンしているため、要求を管理できません。
  • HTTP:TIMEOUT

    http:requester によって送信された要求がタイムアウトになりました。
  • HTTP:TOO_MANY_REQUESTS

    特定の期間内に送信された要求が多すぎます。
  • HTTP:UNAUTHORIZED

    要求された応答を取得するための認証に失敗したか、認証がまだ提供されていません。
  • HTTP:UNSUPPORTED_MEDIA_TYPE

    サーバで要求されたデータのメディア形式がサポートされていません。
  • HTTP:BAD_GATEWAY

    要求を管理するためにゲートウェイまたはプロキシとして機能するサーバが無効な応答を受信しました。
  • HTTP:GATEWAY_TIMEOUT

    要求を管理するためにゲートウェイまたはプロキシとして機能するサーバが指定された時間内に応答を受信しませんでした。
  • HTTP:BASIC_AUTHENTICATION

    HTTP の ​*Request*​ 操作でサービスに要求を送信するための基本認証がないか、指定されたログイン情報が正しくありません。