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​ エンコードを使用することを示す ​responseStreamingModeNEVER​ を使用して設定された 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​ エンコードを使用するために ​requestStreamingModeNEVER​ を使用して設定された 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*​ 操作でサービスに要求を送信するための基本認証がないか、指定されたログイン情報が正しくありません。