404 호스트 별칭이 동일한 여러 가상 호스트

현재 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 퍼블릭 및 프라이빗 클라우드 사용자

일반적인 진단 단계

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 에지 라우터와 메시지 프로세서는 호스트 헤더, 포트 번호, URI 경로를 모두 사용하여 트래픽을 올바른 API 프록시로 라우팅합니다. 호스트 별칭과 포트 번호가 같은 여러 가상 호스트와 같이 모호한 정의는 문서화된 안티패턴이며 예상치 못한 동작으로 이어질 수 있습니다. 관찰할 일반적인 오류 중 하나는 Unable to identify proxy for host: VIRTUAL_HOST and url: PATH 메시지와 함께 404 오류가 발생한 것입니다.

일반적으로 호스트 별칭이 동일한 가상 호스트가 여러 개 있는 경우 간헐적인 404 오류가 발생합니다. 이는 특정 API 프록시가 가상 호스트 중 하나에서만 요청을 수락하도록 구성되어 있을 수 있기 때문입니다. API 요청이 API 프록시에 구성된 특정 가상 호스트로 라우팅되면 성공 응답을 받게 됩니다. 그러나 API 프록시가 요청을 수락하도록 구성되지 않은 다른 가상 호스트로 API 요청이 라우팅되면 API가 이러한 404 오류와 함께 실패합니다.

404 available can beidentifier for host: <virtual host name> and url: <path>에 제공된 안내에 따라 이 오류를 해결하세요. 그 원인으로 이 오류가 발생하지 않으면 아래 단계에 따라 중복 호스트 별칭이 있는 가상 호스트로 인해 404 오류가 발생하는지 확인합니다.

진단

다음 메서드 중 하나를 사용하여 동일한 호스트 별칭/포트 번호를 가진 여러 가상 호스트가 404 오류를 일으키는지 확인합니다.

  • Edge UI
  • Management API

Edge UI

다음 안내에 따라 Edge UI를 사용하여 호스트 별칭/포트 번호가 동일한 가상 호스트가 여러 개 있는지 확인합니다.

예를 들어 URL http://example.com:9001/proxy1에서 404 오류가 발생한 경우 호스트 별칭 example.com와 포트 9001이 있는 가상 호스트를 찾아야 합니다.

  1. Public CloudPrivate Cloud의 새로운 Edge UI에서 다음을 수행합니다.
    1. 관리를 선택합니다.
    2. Virtual Hosts(가상 호스트)를 선택합니다.
    3. Environment에 대해 검색 필터를 사용하여 API 요청이 호출된 특정 호스트 별칭과 일치하는 가상 호스트를 확인합니다.
    4. 동일한 호스트 별칭을 사용하는 가상 호스트가 여러 개 있는 경우 해결 방법으로 이동하여 이 문제를 해결하세요.

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

  2. Private Cloud의 기본 UI:
    1. API 탭을 선택합니다.
    2. 환경 구성을 선택합니다.
    3. Virtual Hosts(가상 호스트)를 선택합니다.
    4. 환경가상 호스트 목록을 보고 API 요청이 호출된 특정 호스트 별칭과 일치하는 항목이 있는지 확인합니다.
    5. 동일한 호스트 별칭과 일치하는 가상 호스트가 여러 개 있는 경우 해결 방법으로 이동하여 이 문제를 해결하세요.

    예:

Management API

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

  1. 조직의 각 환경에 있는 각 가상 호스트의 정의를 가져와서 호스트 별칭과 포트 번호가 동일한 가상 호스트를 확인합니다.

    예를 들어 URL http://example.com:9001/proxy1에서 404 오류가 발생한 경우 호스트 별칭 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" : [ ]
      }
      

      이 예시에서는 서로 다른 두 환경(testdev)에 있는 두 개의 가상 호스트 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
  • 메시지 프로세서 로그
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • 404 오류가 발생한 시간대 정보가 포함된 기간