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

<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 エラーのトラブルシューティングに役立ちます。 次の手順でログを確認します。

  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 プロキシが構成されている リクエストを受け入れるように構成できます。API リクエストが API プロキシで構成されている特定の仮想ホストに限定されている場合は、正常なレスポンスが返されます。 ただし、API プロキシが接続されている他の仮想ホストに API リクエストがルーティングされると、 リクエストを受け入れるように構成されていない場合、API はこれらの 404 で失敗します。 エラーになります。

<ph type="x-smartling-placeholder">

以下の手順に従います。 <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 です。

  1. Public CloudPrivate Cloud の新しい Edge UI の場合: <ph type="x-smartling-placeholder">
      </ph>
    1. [アナリティクス設定] を選択します。
    2. [Virtual Hosts] を選択します。
    3. [Environment] ごとに、検索フィルタを使用して [Virtual Private Cloud(仮想環境) API が使用している特定のホスト エイリアスに一致するホスト 呼び出されたことを示します。
    4. 同じホスト エイリアスを使用する仮想ホストが複数ある場合は、 この問題を解決するための解決策

    例:

  2. プライベート クラウドの従来の UI の場合: <ph type="x-smartling-placeholder">
      </ph>
    1. [API ] タブを選択します。
    2. [Environment Configuration] を選択します。
    3. [Virtual Hosts] を選択します。
    4. 各 [Environment] で、[Virtual Hosts] のリストを表示して、一致するものがあるかどうかを確認します。 API リクエストの呼び出しに使用された特定のホスト エイリアス
    5. 同じホスト エイリアスに一致する仮想ホストが複数ある場合は、次に移動します。 この問題を解決するための解決策

    例:

Management API

<ph type="x-smartling-placeholder">

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

  1. 組織の各環境における各仮想ホストの定義を ホスト・エイリアスとポート番号が同じである仮想ホストを

    たとえば、URL で 404 エラーが見つかった場合、 http://example.com:9001/proxy1 の場合、どの仮想マシンを ホストには、ホスト エイリアス 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 つの仮想ホスト default があることがわかります。 2 つの異なる環境(testdev)で、どちらも 同じホスト エイリアス example.com とポート番号が含まれている 9001。これが 404 エラーの原因です。

    5. 同じホスト エイリアスに一致する仮想ホストが複数ある場合は、次に移動します。 この問題を解決するための解決策

解決策

  1. 各仮想ホストに一意のホスト エイリアスとポートの組み合わせのみが含まれるようにします。
  2. 同じホスト・エイリアスとポートの組み合わせを持つ複数の仮想ホストを特定した場合 一意のホスト エイリアスで更新する必要があります。
  3. これらは Edge UI または Management API を使用して更新できます。手順については、 <ph type="x-smartling-placeholder"></ph>未満 仮想ホストを変更する。
  4. 各ホスト エイリアスに適切な DNS エントリが設定されていることを確認します。 <ph type="x-smartling-placeholder">
  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 ユーザーの場合は、次の情報を提供します。

  • 失敗したリクエストについて観測された完全なエラー メッセージ
  • 組織、環境名、監視対象の 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 エラーが発生したときのタイムゾーン情報の期間