現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください。 情報
内容
クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 502 Bad Gateway
とエラーコード protocol.http.Response405WithoutAllowHeader
を受け取ります。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
HTTP/1.1 502 Bad Gateway
また、次のエラー メッセージが表示される場合があります。
{ "fault":{ "faultstring":"Received 405 Response without Allow Header", "detail":{ "errorcode":"protocol.http.Response405WithoutAllowHeader" } } }
考えられる原因
このエラーは、バックエンド サーバーが Allow
ヘッダーなしで 405 Method Not Allowed
ステータス コードで応答した場合に発生します。
RFC 7231、section 6.5.5: 405 Method Not Allowed の仕様に従って、配信元サーバーは、ターゲット リソースの現在サポートされているメソッドのリストを含む 405
レスポンスで Allow
ヘッダー フィールドを生成し、送信しなければならないことが想定されています。そうでない場合、Apigee は 502 Bad Gateway
とエラーコード protocol.http.Response405WithoutAllowHeader
を返します。
原因 | 説明 | トラブルシューティングの実施対象 |
---|---|---|
バックエンド サーバーからの Allow ヘッダーのない 405 レスポンス | API リクエストを処理しているバックエンド サーバーは、Allow ヘッダーなしで 405 ステータス コードを返します。 |
Edge Public Cloud ユーザーと Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールや手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Edge UI にログインします。
問題を調査する組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した期間を選択します。
[Time] に [Fault Code] をプロットします。
以下に示すように、障害コード
protocol.http.Response405WithoutAllowHeader
を含むセルを選択します。障害コード
protocol.http.Response405WithoutAllowHeader
に関する情報が次のように表示されます。[ログを表示 ] をクリックし、失敗したリクエストのいずれかを開いて、詳細を表示します。
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
502
- 障害ソース:
target
- 障害コード:
protocol.http.Response405WithoutAllowHeader
。
- ステータス コード:
- 障害ソースが
target
で障害コードがprotocol.http.Response405WithoutAllowHeader
の場合、バックエンド サーバーがAllow
ヘッダーなしで405 Method Not Allowed
ステータス コードを返したことを示します。
Trace ツール
Trace ツールを使用してエラーを診断するには:
-
トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gateway
エラーが発生するまで待ちます。- 問題を再現できる場合は、API 呼び出しを行って問題を再現します(
502 Bad Gateway
エラー)
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストの 1 つを選択し、トレースを調べます。
- トレースのさまざまなフェーズを順に確認し、エラーが発生した場所を見つけます。
このエラーは通常、以下に示すように「Request sent to target server」フェーズの後のフローで確認できます。
トレースでのエラーの値をメモします。
上のサンプル トレースでは、エラーが
Received 405 Response without Allow Header
となっています。このエラーは、バックエンド サーバーにリクエストが送信された後に Apigee によって発生したため、バックエンド サーバーがAllow
ヘッダーなしで405
レスポンス ステータス コードを送信したことを示します。- トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
[Phase Details] パネルの [Error / Response Headers] セクションまで下にスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を確認します。
- X-Apigee-fault-code と X-Apigee-fault-source の値がそれぞれ
protocol.http.Response405WithoutAllowHeader
、target
として表示されます。これは、バックエンドがAllow
ヘッダーなしで405
レスポンス ステータス コードを送信したために、このエラーが生じたことを示します。レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
X-Apigee-fault-source target
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
502
エラーに関する重要な情報を特定できます。 NGINX のアクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
ここで:ORG、ORG、PORT# は実際の値に置き換えられます。
- 特定の期間にエラーコード
protocol.http.Response405WithoutAllowHeader
の502
エラーがないか(問題が過去に発生していた場合)、または502
で失敗しているリクエストがあるかどうかを検索します。 X-Apigee-fault-code が
protocol.http.Response405WithoutAllowHeader
の値と一致する502
エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。NGINX のアクセスログの 502 エラーの例:
上記の NGINX アクセスログのエントリ例では、X-Apigee- fault-code と X-Apigee-fault-source に次の値が入っています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
X-Apigee-fault-source target
原因: バックエンド サーバーからの Allow ヘッダーのない 405 レスポンス
診断
- 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、または NGINX アクセスログを使用して、
502 Bad Gateway
の障害コードと障害ソースを特定します。 - 障害コードが
protocol.http.Response405WithoutAllowHeader
で、障害ソースの値がtarget
の場合、バックエンド サーバーがAllow
ヘッダーなしで405
ステータス コードで応答したことを示します。したがって、Apigee はエラーコードprotocol.http.Response405WithoutAllowHeader
とともに502 Bad Gateway
を返します。
解像度
問題を解決するには、次のいずれかの方法を使用します。
バックエンド サーバー
方法 1: Allow ヘッダーを含む 405 ステータス コードを送信するようにバックエンド サーバーを修正します。
バックエンド サーバーが RFC 7231、セクション 6.5.5: 405 メソッドが許可されていない仕様に常に準拠し、以下に示すように
Allow
ヘッダーの一部として許可されるメソッドのリストを含めることで、405
ステータス コードとともに送信するようにします。Allow: HTTP_METHODS
- たとえば、バックエンド サーバーで
GET
、POST
、HEAD
の各メソッドが許可されている場合、次のようにAllow
ヘッダーにこれらのメソッドが含まれていることを確認する必要があります。Allow: GET, POST, HEAD
障害の処理
オプション 2: 障害処理を使用して、API プロキシから Allow ヘッダーを含む 405 ステータス コードを送信します。
バックエンド サーバーが Allow
ヘッダーなしで 405
ステータス コードを返す場合は、次のように、フォールト処理を使用して API プロキシからの 405
ステータス コードと Allow
ヘッダーで応答できます。
AssignMessage ポリシーや RaiseFault ポリシーなどのポリシーを作成し、
Allow
ヘッダーとカスタム メッセージを使用してステータス コードを405
に設定します。Allow ヘッダーを付けて 405 を送信する AssignMessage ポリシーの例:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
TargetEndpoint
にFaultRule
を作成します。これは、エラーコードprotocol.http.Response405WithoutAllowHeader
の502
エラーを取得したときにポリシーを呼び出します。FaultRule を示す TargetEndpoint 構成の例:
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>
- これらの変更を API プロキシの新しいリビジョンに保存し、リビジョンをデプロイします。
- API 呼び出しを行い、
Allow
ヘッダーを含む405
ステータス コードを取得していることを確認します。
プロパティの設定
オプション 3: Apigee Edge が 502 エラーを返さないように Message Processor のプロパティを構成する
- Private Cloud ユーザーは、プロパティ
HTTP.ignore.allow_header.for.405
をtrue
に更新することで、バックエンド サーバーがAllow
ヘッダーなしで405
ステータス コードで応答した場合でも、Apigee Edge が502
エラーを発生させないようにすることができます。入門ガイド: Message Processors で 405 プロパティに ignore allow ヘッダーを構成するをご覧ください。 - Public Cloud ユーザー の方は、Apigee Edge サポートまでお問い合わせください。
仕様
Apigee は、次の仕様に従い、バックエンド サーバーからの 405 Method Not Allowed
レスポンスと Allow
ヘッダーを想定しています。
仕様 | |
---|---|
RFC 7231、section 6.5.5: 405 Method Not Allowed | |
RFC 7231 のセクション 7.4.1: 許可 |
重要なポイント
推奨される解決策は、Allow
ヘッダー付きの 405
ステータス コードを送信し、
RFC 7231、セクション 6.5.5: 405 Method Not Allowed の仕様に準拠するようにバックエンド サーバーを修正することです。
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の診断情報を収集して Apigee Edge サポートに連絡してください。
Public Cloud ユーザーの場合は、次の情報を入力します。
- 組織の名前
- 環境名
- API プロキシ名
- エラーコード
protocol.http.Response405WithoutAllowHeader
の502 Bad Gateway
を再現するために使用するcurl
コマンドを完了します。 - API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を入力します。
- 失敗したリクエストについて確認された完全なエラー メッセージ
- 環境名
- API プロキシ バンドル
- API リクエストのトレース ファイル
NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
ここで:ORG、ORG、PORT# は実際の値に置き換えられます。
- Message Processor のシステムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log