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

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが HTTP ステータス コード 404 を受け取ります。API 呼び出しへのレスポンスとして、メッセージ Not 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 ユーザー

共通の診断手順

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

  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 が存在するかどうか、またはステップ 2 で取得した一意のメッセージ ID が API リクエストに対してあるかどうかを確認します。

    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 つは、メッセージ Unable to identify proxy for host: VIRTUAL_HOST and url: PATH を含む 404 エラーです。

通常、同じホスト エイリアスを持つ複数の仮想ホストが存在する場合は、断続的に 404 エラーが発生します。これは、1 つの仮想ホストだけでリクエストを受け入れるように特定の API プロキシが構成されている場合があるためです。API プロキシで構成されている特定の仮想ホストに API リクエストがルーティングされると、正常なレスポンスが返されます。ただし、API プロキシがリクエストを受け入れるように構成されていない他の仮想ホストに API リクエストがルーティングされると、API はこれらの 404 エラーで失敗します。

404 ホストのプロキシを識別できません: <仮想ホスト名> and url: <path> の手順に沿って、このエラーのトラブルシューティングを行います。このエラーの原因がどれも当てはまらない場合は、以下の手順を使用して、重複するホスト エイリアスを持つ仮想ホストが 404 エラーの原因かどうかを確認します。

診断

次のいずれかの方法で、404 エラーが発生している同じホスト エイリアス/ポート番号を持つ複数の仮想ホストがあるかどうかを確認します。

  • Edge UI
  • Management API

Edge UI

Edge UI で次の手順を使用して、同じホスト エイリアス/ポート番号を持つ複数の仮想ホストがあるかどうかを確認します。

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

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

    例:

  2. Private Cloud の Classic UI で次の操作を行います。
    1. [API ] タブを選択します。
    2. [Environment Configuration] を選択します。
    3. [Virtual Hosts] を選択します。
    4. [Environment] ごとに [仮想ホスト] のリストを表示し、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 プロキシ名
  • curl コマンドを完了して 404 エラーを再現する
  • 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 エラーが発生したときのタイムゾーン情報の期間