<ph type="x-smartling-placeholder"></ph>
現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント。 詳細
症状
クライアント アプリケーションは、API 呼び出しのレスポンスとして、メッセージ Not
Found
とエラー メッセージ Unable to identify proxy for host: VIRTUAL_HOST and
url: PATH
を含む HTTP ステータス コード 404
を取得します。
このエラーは、Edge が指定された仮想ホストとパスの API プロキシを見つけられなかったことを意味します。
エラー メッセージ
クライアント アプリケーションは次のレスポンス コードを受け取ります。
HTTP/1.1 404 Not Found
また、次のようなエラー メッセージが表示される場合があります。
{ "fault":{ "faultstring":"Unable to identify proxy for host: default and url: \/oauth2\/token", "detail":{ "errorcode":"messaging.adaptors.http.flow.ApplicationNotFound" } } }
考えられる原因
原因 | 説明 | トラブルシューティングの実施対象 |
---|---|---|
ホスト エイリアスが重複している仮想ホスト | 複数の仮想ホストで同じホスト エイリアスとポート番号が使用されています。 | Edge Public Cloud ユーザーと Edge Private Cloud ユーザー |
共通の診断手順
NGINX と Message Processor のログは、404
エラーのトラブルシューティングに役立ちます。
次の手順でログを確認します。
- 次のコマンドを使用して、NGINX のログを表示します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- ログエントリの次のフィールドを確認します。
フィールド 値 Upstream_status, status
404
X-Apigee-fault-code
messaging.adaptors.http.flow.ApplicationNotFound
ログのメッセージ ID をメモします。
- Message Processor のログを確認する
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)
して、 特定の API にmessaging.adaptors.http.flow.ApplicationNotFound
があるか、 API リクエストのステップ 2 のメッセージ ID を指定します。Message Processor ログのエラー メッセージの例
NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/weather, message Id:null, exception:com.apigee.rest.framework.ResourceNotFoundException{ code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for host: vh1 and url: /weather, associated contexts = []}, context:Context@342ea86b input=ClientInputChannel(SSLClientChannel[Accepted: Remote:10.123.123.123:8443 Local:10.135.33.68:62092]@1206954 useCount=1 bytesRead=0 bytesWritten=0 age=1ms lastIO=0ms isOpen=true)
上記のログには、次のようなエラーコードとエラー メッセージが表示されます。
code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for host: vh1 and url: /weather
原因: 同じホスト エイリアスとポート番号を持つ複数の仮想ホスト
Apigee Edge Router と Message Processor は、ホストヘッダー、ポート番号、URI パスの両方を使用します。
適切な API プロキシにトラフィックをルーティングします。複数の仮想サーバーがあるなど、定義が曖昧な
同じホスト エイリアスとポート番号を持つホストについては、
アンチパターンと
予期しない動作が発生する可能性があります。よく見られるエラーの 1 つは、
404
エラーとメッセージ Unable to identify proxy for host: VIRTUAL_HOST
and url: PATH
。
通常、同じホスト エイリアスを持つ複数の仮想ホストが存在する場合、
断続的な 404
エラー。これは、特定の API プロキシが構成されている
リクエストを受け入れるように構成できます。API リクエストが
API プロキシで構成されている特定の仮想ホストに限定されている場合は、正常なレスポンスが返されます。
ただし、API プロキシが接続されている他の仮想ホストに API リクエストがルーティングされると、
リクエストを受け入れるように構成されていない場合、API はこれらの 404
で失敗します。
エラーになります。
以下の手順に従います。
<ph type="x-smartling-placeholder"></ph>
404 Unable toidentify proxy for host: <仮想ホスト名>および url: <path> および
トラブルシューティングを行いますどの原因でもこのエラーが発生しない場合は、次の手順を実施します。
以下で、ホスト エイリアスが重複する仮想ホストが 404
の原因であるかどうかを判断します。
エラーになります。
診断
次のいずれかの方法を使用して、同じ IP アドレスを持つ仮想ホストが複数あるかどうかを確認します。
404
エラーにつながる同じホスト エイリアス/ポート番号:
- Edge UI
- Management API
Edge UI
<ph type="x-smartling-placeholder">以下の手順を使用して、同じホストを持つ仮想ホストが複数あるかどうかを確認します。 エイリアス/ポート番号を指定します。
たとえば、URL で 404
エラーが見つかった場合、
http://example.com:9001/proxy1
の場合、どの仮想ホストに
ホスト エイリアス example.com
とポート 9001
です。
- Public Cloud と Private Cloud の新しい Edge UI の場合:
<ph type="x-smartling-placeholder">
- </ph>
- [アナリティクス設定] を選択します。
- [Virtual Hosts] を選択します。
- [Environment] ごとに、検索フィルタを使用して [Virtual Private Cloud(仮想環境) API が使用している特定のホスト エイリアスに一致するホスト 呼び出されたことを示します。
- 同じホスト エイリアスを使用する仮想ホストが複数ある場合は、 この問題を解決するための解決策。
例:
- プライベート クラウドの従来の UI の場合:
<ph type="x-smartling-placeholder">
- </ph>
- [API ] タブを選択します。
- [Environment Configuration] を選択します。
- [Virtual Hosts] を選択します。
- 各 [Environment] で、[Virtual Hosts] のリストを表示して、一致するものがあるかどうかを確認します。 API リクエストの呼び出しに使用された特定のホスト エイリアス。
- 同じホスト エイリアスに一致する仮想ホストが複数ある場合は、次に移動します。 この問題を解決するための解決策。
例:
Management API
<ph type="x-smartling-placeholder">以下の手順を使用して、同じホストを持つ仮想ホストが複数あるかどうかを確認します。 エイリアス/ポート番号を指定します。
組織の各環境における各仮想ホストの定義を ホスト・エイリアスとポート番号が同じである仮想ホストを
たとえば、URL で
404
エラーが見つかった場合、http://example.com:9001/proxy1
の場合、どの仮想マシンを ホストには、ホスト エイリアスexample.com
とポート9001
があります。環境のリストを取得する
Public Cloud ユーザー:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
Private Cloud ユーザー:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
ここで
ORGANIZATION_NAME は組織の名前です。
例:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
[ "prod", "test", "dev" ]
環境内の仮想ホストのリストを取得する
Public Cloud ユーザー:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
Private Cloud ユーザー:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
ここで
ORGANIZATION_NAME は組織の名前です。
ENVIRONMENT_NAME は、環境の名前です。
例:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
[ "default" ]
環境内の各仮想ホストの定義を取得します。
Public Cloud ユーザー:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
Private Cloud ユーザー:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
ここで
ORGANIZATION_NAME は組織の名前です。
ENVIRONMENT_NAME は、環境の名前です。
VIRTUAL_HOST_NAME は、仮想ホストの名前です。
例:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u USERNAME
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
組織内の他の環境について、上記の 2 つのステップを繰り返します。
この例では、
dev
環境に対してこの手順を繰り返します。curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts -u USERNAME
[ "default" ]
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u USERNAME
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
この例では、2 つの仮想ホスト
default
があることがわかります。 2 つの異なる環境(test
とdev
)で、どちらも 同じホスト エイリアスexample.com
とポート番号が含まれている9001
。これが404
エラーの原因です。- 同じホスト エイリアスに一致する仮想ホストが複数ある場合は、次に移動します。 この問題を解決するための解決策。
解決策
- 各仮想ホストに一意のホスト エイリアスとポートの組み合わせのみが含まれるようにします。
- 同じホスト・エイリアスとポートの組み合わせを持つ複数の仮想ホストを特定した場合 一意のホスト エイリアスで更新する必要があります。
- これらは Edge UI または Management API を使用して更新できます。手順については、 <ph type="x-smartling-placeholder"></ph>未満 仮想ホストを変更する。
- 各ホスト エイリアスに適切な DNS エントリが設定されていることを確認します。 <ph type="x-smartling-placeholder">
- 上記の例で、次のような構成があるとします。
curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
[ "prod", "test", "dev" ]
curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
- 重複しないように、間違った仮想ホストを更新できます。
- つまり、ホスト エイリアスを
example2.com
として更新します。 - 新しいホスト エイリアスの DNS エントリが、以前のホスト エイリアスと類似していることを確認します。
curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user -H 'Content-Type: application/json' -d '{ "hostAliases" : [ "example2.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }' -i
HTTP/1.1 200 OK Date: Tue, 02 Feb 2021 20:54:29 GMT Content-Type: application/json X-Apigee.user: user X-Apigee.organization: myorg X-Apigee.environment: dev X-Apigee.backends: management-server Date: Tue, 02 Feb 2021 20:54:29 GMT Content-Length: 152 { "hostAliases" : [ "example2.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
- プロキシに対して再度 API 呼び出しを行い、正常なレスポンスが一貫して返されることを確認します。
curl http://example.com:9001/proxy1
{ "slideshow": { "author": "Yours Truly", "date": "date of publication", "slides": [ { "title": "Wake up to WonderWidgets!", "type:": "all" }, { "items": [ "Why WonderWidgets are great", "Who buys WonderWidgets" ], "title": "Overview", "type": "all" } ], "title": "Sample Slide Show" } }
- 問題が解決しない場合は、診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、以下の情報を収集します。 Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供します。
- 組織名
- 環境名
- API プロキシ名
404
エラーを再現するためにcurl
コマンドを完成させる404
エラーが現在発生していない場合は、発生期間 過去に404
エラーが発生した場合のタイムゾーン情報。
Private Cloud ユーザーの場合は、次の情報を提供します。
- 失敗したリクエストについて観測された完全なエラー メッセージ
- 組織、環境名、監視対象の API プロキシ名
404
件のエラー - API プロキシ バンドル
- NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
- Message Processor のログ
/opt/apigee/var/log/edge-message-processor/logs/system.log
404
エラーが発生したときのタイムゾーン情報の期間