404 同じホスト エイリアスを持つ複数の仮想ホスト

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します
info

症状

API 呼び出しのレスポンスで、クライアント アプリケーションが HTTP ステータス コード 404Not Found というメッセージ、Unable to identify proxy for host: VIRTUAL_HOST and url: PATH というエラー メッセージが返されます。

このエラー メッセージは、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 と Private Cloud のユーザー

共通の診断手順

404 エラーのトラブルシューティングには、NGINX ログと Message Processor ログが役立ちます。 ログを確認する手順は次のとおりです。

  1. 次のコマンドを使用して NGINX ログを表示します。
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. ログエントリで次のフィールドを確認します。
    フィールド
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    ログからメッセージ ID をメモします。

  3. Message Processor ログ (/opt/apigee/var/log/edge-message-processor/logs/system.log))を確認して、特定の API に対して messaging.adaptors.http.flow.ApplicationNotFound が発生しているかどうか、または API リクエストに対してステップ 2 の一意の メッセージ ID があるかどうかを確認します。

    Message Processor ログに記録されたエラー メッセージの例

  4. 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 プロキシが、いずれか 1 つの仮想ホストでのみリクエストを受け入れるように構成されている可能性があるためです。API リクエストが API プロキシで構成されている 特定の仮想ホストにルーティングされると、正常なレスポンスが返されます。 ただし、API プロキシでリクエストを受け入れるように構成されていない他の仮想ホストに API リクエストがルーティングされると、API はこれらの 404 エラーで失敗します。

404 Unable to identify proxy for host: <仮想ホスト名> and url: <パス>の手順に沿って、 このエラーのトラブルシューティングを行います。いずれの原因でもこのエラーが発生しない場合は、次の手順 で、ホスト エイリアスが重複している仮想ホストが404 エラーの原因になっているかどうかを判断します。

診断

次のいずれかの方法を使用して、同じホスト エイリアスまたはポート番号を持つ複数の仮想ホストが 404 エラーの原因になっているかどうかを判断します:

  • Edge UI
  • Management API

Edge UI

以下の手順に沿って、Edge UI を使用して、同じホスト エイリアスまたはポート番号を持つ複数の仮想ホストがあるかどうかを判断します。

たとえば、URL http://example.com:9001/proxy1404 エラーが発生した場合は、ホスト エイリアス example.com とポート 9001 を持つ仮想ホストを見つける必要があります。

  1. Public CloudPrivate Cloud の新しい Edge UI:
    1. [アナリティクス設定] を選択します。
    2. [Virtual Hosts] を選択します。
    3. 環境 で検索フィルタを使用して、API リクエストの呼び出しに使用された特定のホスト エイリアス に一致する仮想 ホスト を特定します。
    4. 同じホスト エイリアス を使用している複数の仮想ホスト が見つかった場合は、 解決策に進んでこの問題を解決します。

    例:

  2. Private Cloud の従来の UI:
    1. [APIs ] タブを選択します。
    2. [環境の設定] を選択します。
    3. [Virtual Hosts] を選択します。
    4. 環境で、仮想ホストのリストを表示して、API リクエストの呼び出しに使用された特定のホスト エイリアスに一致するものがあるかどうかを確認します。
    5. 同じホスト エイリアス に一致する複数の仮想ホスト が見つかった場合は、 解決策に進んでこの問題を解決します。

    例:

Management API

以下の手順に沿って、Management API を使用して、同じホスト エイリアスまたはポート番号を持つ複数の仮想ホストがあるかどうかを判断します。

  1. 組織内の各環境で各仮想ホストの定義を取得して、同じホスト エイリアスとポート番号を持つ仮想ホストを確認します。

    たとえば、URL http://example.com:9001/proxy1404 エラーが発生した場合は、ホスト エイリアス example.com とポート 9001 を持つ仮想 ホストを見つける必要があります。

    1. 環境のリストを取得する

      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" ]
    2. 環境内の仮想ホストのリストを取得する

      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" ]
    3. 環境内の各仮想ホストの定義を取得します。

      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" : [ ]
      }
    4. 組織内の他の環境について、上記の 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 つの異なる環境(testdev)にある 2 つの仮想ホスト default に、同じホスト エイリアス example.com とポート番号 9001 が含まれていることがわかります。これが 404 エラーの原因です。

    5. 同じホスト エイリアス に一致する複数の仮想ホスト が見つかった場合は、 解決策に進んでこの問題を解決します。

解決策

  1. 各仮想ホストに一意のホスト エイリアスとポートの組み合わせのみが含まれていることを確認します。
  2. 同じホスト エイリアスとポートの組み合わせを持つ複数の仮想ホストを特定した場合は、一意のホスト エイリアスで更新する必要があります。
  3. これらの更新は、Edge UI または Management API を使用して行うことができます。手順については、 仮想ホストを変更するをご覧ください。
  4. 各ホスト エイリアスに適切な DNS エントリがあることを確認します。
  5. 上記の例で、構成が次のようになっているとします。
    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" : [  ]
    }
    1. 重複しないように、誤った仮想ホストを更新できます。
    2. つまり、ホスト エイリアスを example2.com に更新します。
    3. 新しいホスト エイリアスに、以前のホスト エイリアスと同様の 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" : [  ]
      }
  6. プロキシに 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"
        }
    
    }
  7. 問題が解決しない場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の 診断情報を収集して Apigee Edge サポートにお問い合わせください。

Public Cloud ユーザーの場合は、次の情報を提供してください。

  • 組織名
  • 環境名
  • API プロキシ名
  • 404 エラーを再現するための完全な curl コマンド
  • 404 エラーが現在発生していない場合は、過去に 404 エラーが発生した期間とタイムゾーン情報を提供してください。

Private Cloud ユーザーの場合は、次の情報を提供してください。

  • 失敗したリクエストで確認されたエラー メッセージの全文
  • `404` エラーが発生している組織、環境名、API プロキシ名
  • 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 エラーが発生した期間とタイムゾーン情報