ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとしてエラーコード
protocol.http.TooBigLine の HTTP ステータス コード 502 Bad Gateway を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 502 Bad Gateway
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"response line size exceeding 2,048",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}考えられる原因
このエラーは、HTTP レスポンスの一部としてターゲット/バックエンド サーバーから Apigee Edge に送信された Response-Line のサイズが、Apigee Edge で許可されている上限 limit in Apigee Edge を超えている場合に発生します。
このエラーの原因を調べる前に、Response-Line の意味とサイズを確認する方法について説明します。
Response-Line について
一般的な HTTP レスポンスは、次の 3 つの部分で構成されます。
- Status-Line(Apigee では Response-Line と呼ばれます)
- (HTTP ヘッダーのセット)
- [ Body ]
Response-Line は、次の図に示すように、プロトコル バージョン 、数値 ステータス コード 、関連するテキスト フレーズ の 3 つの部分で構成されます。
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
ターゲット/バックエンド サーバー アプリケーションから HTTP レスポンスが送信されると、送信される最初の行は、上記のResponse-Lineを表します。その後に
ヘッダーとレスポンス本文/ペイロードが続きます。次のサンプル スクリーンショットは、一般的な
curl リクエスト、[Request] 部分、[Response] 部分(
Response-Line を含む)を示しています。
Response-Line のサイズについて
上記のサンプルでは、レスポンスの開始行(最初の行)は Response-Lineとも呼ばれ、次のようになります。
HTTP/1.1 200 OK
この Response-Line には
15 ASCII charactersが含まれているため、サイズは~15 bytesです。これは Apigee Edge で許可されている上限内であるため、Apigee Edge はエラーなしでレスポンスをクライアントに返します。- 同様に、上記の
エラー メッセージの
faultstringには、"response line size exceeding 2,048"が含まれています。これは、ターゲット/バックエンド サーバーから送信された HTTP レスポンスのResponse-Line が 2,048 バイトを超えていることを示しています。
大きな Response-Line について
Status-Line(ここではResponse-Lineと呼ばれます)の定義と一般的な HTTP リクエストとレスポンスに従うと、サイズは Apigee Edge で定義されているデフォルトの上限である 2 K よりもはるかに小さくなるため、上限に達することはないと考えられます。ただし、この上限を超える可能性があるシナリオがいくつかあります。
- ターゲット/バックエンド サーバーが HTTP システムではない。HTTP 以外の レスポンスで応答している可能性があります。
- ターゲット/バックエンド サーバーに問題があり、HTTP レスポンスの一部として長い Response-Line を送信している。
詳細については、 エラー protocol.http.TooBigLine, "response line size exceeding 2,048 を取得するをご覧ください。
このエラーの原因として考えられるのは次のとおりです。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| Response-Line のサイズが許可されている上限を超えている | ターゲット/バックエンド サーバーから Apigee Edge への HTTP レスポンスの一部として送信された Response-Line のサイズが、Apigee Edge で許可されている 上限 を超えている | Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UIにログインします。
問題を調査する組織に切り替えます。
- [分析 > API Monitoring > 調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
- [プロキシ] フィルタを選択して、障害コードを絞り込むことができます。
- [障害コード] を [時間] に対してプロットします。
次の図に示すように、障害コード
protocol.http.TooBigLineを含むセルを選択します。( 大きい画像を表示)
次の図に示すように、障害コード
protocol.http.TooBigLineに関する情報が表示されます。( 大きい画像を表示)
[ログを表示] をクリックし、失敗したリクエストの行を展開します。
- [ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
502 - 障害の発生元:
target - 障害コード:
protocol.http.TooBigLine。
- ステータス コード:
- If the [Fault Source] has the value
targetand the [Fault Code] has the valueprotocol.http.TooBigLine, then that indicates that the HTTP レスポンス from the target/ バックエンド サーバー has a Response-Line size greater than the maximum allowed limit in Apigee Edge.
Trace ツール
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gatewayエラーが発生するまで待ちます。または- 問題が再現できる場合は、API 呼び出しを行って
502 Bad Gatewayエラーを再現します。
- 失敗したリクエストのいずれかを選択して、トレースを調べます。
- トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
通常、次の図に示すように、[Request sent to target server] フェーズの直後の
flowinfoError にエラーが表示されます。
トレースからエラーの値を確認します。
- error:
response line exceeding 2,048 - error.class:
com.apigee.errors.http.server.BadGateway
これは、Apigee Edge(Message Processor コンポーネント)が、Response-Line のサイズが許可されている上限を超えているため、バックエンド サーバーからレスポンスを受信するとすぐにエラーをスローすることを示しています。
- error:
[Response Sent to Client] フェーズでクライアントに送信されたエラー メッセージが表示されます。
( 大きい画像を表示)
- トレースからエラーの値を確認します。
- エラー:
502 Bad Gateway。 - エラー コンテンツ:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- エラー:
トレースの [AX](Analytics Data Recorded)フェーズに移動してクリックすると、エラーの詳細を確認できます。
( 大きい画像を表示)
次の値を確認します。
リクエスト ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetエラー コンテンツ : 本文 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
502エラーに関する重要な情報を確認できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log説明: ORG、ENV、PORT# は実際の値に置き換えます。
- 特定の期間に
502エラーが発生しているかどうか(過去に問題が発生した場合)、または502で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が値
protocol.http.TooBigLineと一致する502エラーが見つかった場合は、 X-Apigee-fault-source の値を特定します。
NGINX アクセスログの上記のサンプル エントリには、X- Apigee-fault-code と X-Apigee-fault-source: の値が次のように設定されています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source target
原因: Response-Line のサイズが許可されている上限を超えている
診断
- 共通の診断手順の説明に従って、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード と障害の発生元 を特定します。
- [障害の発生元] の値が
targetの場合、ターゲット/バックエンド サーバー アプリケーションから Apigee に送信された Response-Line のサイズが、Apigee Edge で許可されている上限を超えていることを示します。 Response-Line のサイズが 2 KB の上限を超えていることを確認するには、次のいずれかの方法を使用します。
エラー メッセージ
エラー メッセージを使用して検証するには:
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。エラー メッセージの例:
"faultstring":"response line size exceeding 2,048"
上記の
faultstringは、Response-Line のサイズが 2 KB の上限を超えていることを示しています。実際のリクエスト
実際のリクエストを使用して検証するには:
ターゲット/バックエンド サーバー アプリケーションに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
- Response-Line のサイズを確認します。
- URI のサイズが Apigee Edge で
許可されている上限を超えている場合は、それが問題の原因です。
ターゲット/バックエンド サーバーからのレスポンスの例:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
上記の場合、Response-Line
HTTP/1.1 200 1111…<trimmed>...11111111は 2 KB より大きく、2 K を超える ASCII 文字が含まれています。他のクライアントを使用している場合は、クライアント ログを確認して、 Apigee Edge に送信される Response-Line のサイズを確認できます。
Message Processor ログ
Message Processor ログを使用して検証するには:
Private Cloud ユーザーの場合は、Message Processor ログを使用して、Response-Line のサイズが Apigee Edge で許可されている上限を超えているかどうかを確認できます。
- 共通の診断手順の説明に従って、API Monitoring、Trace ツール、 または NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を特定します。
Message Processor ログでメッセージ ID を検索します。
/opt/apigee/var/log/edge-message-processor/logs/system.log次のような
system.logの行が表示されます。2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
上記のエラー メッセージのテキスト
message = response line size exceeding 2,048は、Response-Line のサイズが 2 KB を超えていることを示しています。そのため、 Apigee Edge は例外をスローし、障害コードprotocol.http.TooBiglineの502ステータス コードをクライアント アプリケーションに返します。
解決策
サイズを修正する
オプション 1 [推奨]: ターゲット/バックエンド サーバー アプリケーションが許可されている上限を超えるサイズの Response-Line を送信しないように修正する
- 上限で定義されているように、特定のクライアントが許可されている上限を超えるサイズの Response-Line を送信する理由を分析します。
- 望ましくない場合は、許可されている上限未満のサイズの Response-Line を送信するようにターゲット/バックエンド サーバー アプリケーションを変更します。
- 望ましく、許可されている上限を超えるサイズの Response-Line を送信する場合は、次のオプションに進みます。
CwC
オプション 2: CwC プロパティを使用して Response-Line の上限を引き上げる
Apigee には、Response-Line のサイズ上限を引き上げるための CwC プロパティが用意されています。 詳細については、 Message Processor の Response-Line の上限を設定するをご覧ください。
上限
Apigee は、クライアント アプリケーションとバックエンド サーバーが、許可されている上限を超えるサイズのリクエスト/レスポンス行 を送信しないことを想定しています。これは、Apigee Edge の上限のリクエスト/レスポンス行の上限で説明されています。
- Public Cloud ユーザーの場合、リクエストと レスポンスの行のサイズの上限は、リクエスト/レスポンス行のサイズで説明されているとおりです。 Apigee Edge の上限
- **Private Cloud ユーザー** の場合は、リクエストとレスポンスの行のサイズのデフォルトの上限を変更している可能性があります(推奨される方法ではありません)。Response-Line のサイズ上限を確認するには、 現在の上限を確認する方法の手順に沿って操作します。
現在の上限を確認する方法
このセクションでは、Message Processor でプロパティ HTTPResponse.line.limit が
新しい値で更新されていることを確認する方法について説明します。
- Message Processor マシンで、プロパティ
HTTPResponse.line.limitを/opt/apigee/edge-message-processor/confディレクトリで検索し、 次の図に示すように設定されている値を確認します。grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- 上記のコマンドのサンプル結果は次のとおりです。
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
上記の出力例では、プロパティ
HTTPResponse.line.limitがhttp.propertiesで値2kに設定されていることに注意してください。これは、Apigee for Private Cloud で構成された Response-Line のサイズの上限が 2 KB であることを示しています。
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
502エラーを再現するために使用した完全な curl コマンド- API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認された完全なエラー メッセージ
- 組織名
- 環境名
- API プロキシ バンドル
- 失敗した API リクエストのトレース ファイル
502エラーを再現するために使用した完全なcurlコマンド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