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 오류 메시지와 함께 404의 HTTP 상태 코드를 가져옵니다.

이 오류는 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"
      }
   }
}

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
중복된 호스트 별칭을 사용하는 가상 호스트 여러 가상 호스트는 호스트 별칭과 포트 번호가 동일합니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자

일반적인 진단 단계

NGINX 및 메시지 프로세서 로그는 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. 메시지 프로세서 로그 확인 (/opt/apigee/var/log/edge-message-processor/logs/system.log)에서 다음을 확인하세요. 특정 API에 대한 messaging.adaptors.http.flow.ApplicationNotFound가 있거나 고유한 API 요청에 대한 2단계의 메시지 ID입니다.

    메시지 프로세서 로그의 샘플 오류 메시지

  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 라우터 및 메시지 프로세서가 호스트 헤더, 포트 번호, URI 경로를 모두 사용합니다. 올바른 API 프록시로 트래픽을 라우팅해야 합니다 여러 가상 머신과 같은 모호한 정의가 있는 경우 호스트 별칭과 포트 번호가 동일한 호스트는 문서화되어 있으므로 안티패턴과 예기치 않은 동작을 유발할 수 있습니다. 흔히 접하게 되는 오류 중 하나는 Unable to identify proxy for host: VIRTUAL_HOST and url: PATH 메시지와 함께 404 오류가 발생했습니다.

일반적으로 호스트 별칭이 동일한 가상 호스트가 여러 개 있는 경우 간헐적인 404 오류 이는 특정 API 프록시가 하나의 가상 호스트에서만 요청을 수락할 수 있습니다. API 요청이 특정 가상 호스트를 사용하면 성공 응답을 받게 됩니다. 그러나 API 요청이 API 프록시가 설정된 다른 가상 호스트로 라우팅되면 요청을 수락하도록 구성되지 않은 경우 API가 실패하고 이러한 404가 표시됩니다. 오류가 발생했습니다.

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

<ph type="x-smartling-placeholder"></ph> 404 호스트의 프록시를 식별할 수 없음: <가상 호스트 이름> url: <path> 및 이 오류를 해결할 수 있습니다. 이 오류가 발생하는 원인이 없으면 다음 단계를 따르세요. 아래에서 중복된 호스트 별칭이 있는 가상 호스트로 인해 404이(가) 발생하는지 확인하세요. 오류가 발생했습니다.

진단

다음 방법 중 하나를 사용하여 동일한 호스트 별칭/포트 번호로 404 오류 발생:

  • Edge UI
  • Management API

Edge UI

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

다음 안내에 따라 동일한 호스트를 가진 가상 호스트가 여러 개 있는지 확인하세요. 별칭/포트 번호를 입력합니다.

예를 들어 URL에 404 오류가 있는 경우 http://example.com:9001/proxy1인 경우 어떤 가상 호스트가 호스트 별칭 example.com 및 포트 9001.

  1. 퍼블릭 클라우드프라이빗 클라우드의 새 Edge UI: <ph type="x-smartling-placeholder">
      </ph>
    1. 관리를 선택합니다.
    2. Virtual Hosts(가상 호스트)를 선택합니다.
    3. 환경 검색 필터를 사용하여 가상 환경을 API가 사용되는 특정 호스트 별칭과 일치하는 호스트 호출되었습니다.
    4. 동일한 호스트 별칭을 사용하는 여러 개의 가상 호스트가 있는 경우 이 문제를 해결하기 위한 해결 방법을 확인하세요.

    예를 들면 다음과 같습니다.

  2. Private Cloud의 기본 UI: <ph type="x-smartling-placeholder">
      </ph>
    1. API 탭을 선택합니다.
    2. 환경 구성을 선택합니다.
    3. Virtual Hosts(가상 호스트)를 선택합니다.
    4. 환경가상 호스트 목록에서 일치하는 항목이 있는지 확인합니다. API 요청이 호출된 특정 호스트 별칭
    5. 동일한 호스트 별칭과 일치하는 가상 호스트가 여러 개 있는 경우 이 문제를 해결하기 위한 해결 방법을 확인하세요.

    예:

Management API

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

다음 안내에 따라 동일한 호스트를 가진 가상 호스트가 여러 개 있는지 확인하세요. 별칭/포트 번호를 입력합니다.

  1. 운영 체제의 각 환경의 각 가상 호스트에 대한 정의를 어떤 가상 호스트가 동일한 호스트 별칭과 포트 번호를 가지고 있는지 확인할 수 있습니다.

    예를 들어 URL에 404 오류가 있는 경우 http://example.com:9001/proxy1이면 어떤 가상 머신이 호스트 별칭은 example.com이고 포트는 9001입니다.

    1. 환경 목록 가져오기

      퍼블릭 클라우드 사용자:

      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. 환경의 가상 호스트 목록 가져오기

      퍼블릭 클라우드 사용자:

      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. 환경의 각 가상 호스트에 대한 정의를 가져옵니다.

      퍼블릭 클라우드 사용자:

      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. 조직의 다른 환경에도 위의 두 단계를 반복합니다.

      이 예시에서는 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" : [ ]
      }
      

      이 예시에서는 두 가상 호스트 default가 서로 다른 두 환경(testdev)에서 동일한 호스트 별칭 example.com 및 포트 번호를 포함해야 함 9001입니다. 이는 404 오류의 원인입니다.

    5. 동일한 호스트 별칭과 일치하는 가상 호스트가 여러 개 있는 경우 이 문제를 해결하기 위한 해결 방법을 확인하세요.

해상도

  1. 각 가상 호스트에 고유한 호스트 별칭 및 포트 조합만 포함되어 있는지 확인합니다.
  2. 호스트 별칭 및 포트 조합이 동일한 여러 가상 호스트를 확인한 경우 고유한 호스트 별칭으로 업데이트해야 합니다.
  3. Edge UI 또는 Management API를 사용하여 업데이트할 수 있습니다. 안내는 미만 가상 호스트 수정
  4. 각 호스트 별칭에 적절한 DNS 항목이 있는지 확인합니다. <ph type="x-smartling-placeholder">
  5. 위에서 설명한 예에서 구성이 다음과 같다면
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
    
    [ "prod", "test", "dev" ]
    
    <ph type="x-smartling-placeholder">
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
    
    </ph>
    {
      "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 지원팀에 문의하세요.

퍼블릭 클라우드 사용자인 경우 다음 정보를 입력합니다.

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • curl 명령어를 완료하여 404 오류를 재현합니다.
  • 404 오류가 현재 발생하지 않고 있다면 기간을 제공합니다. 이전에 404 오류가 발생했을 때의 시간대 정보를 포함합니다.

Private Cloud 사용자인 경우 다음 정보를 입력합니다.

  • 실패한 요청에 대해 발견된 전체 오류 메시지
  • 관찰 중인 조직, 환경 이름, API 프록시 이름 오류 404
  • API 프록시 번들
  • NGINX 액세스 로그
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • 메시지 프로세서 로그
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • 404 오류 발생 시 시간대 정보가 포함된 기간