404 Несколько виртуальных хостов с одним и тем же псевдонимом хоста

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Симптом

В ответ на вызовы API клиентское приложение получает HTTP-статус 404 с сообщением 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"
      }
   }
}

Возможные причины

Причина Описание Инструкции по устранению неполадок, применимые для
Виртуальный хост с дублирующимся псевдонимом хоста Несколько виртуальных хостов имеют одинаковый псевдоним хоста и номер порта. Пользователи публичных и частных облачных сервисов на периферии сети

Общие этапы диагностики

Журналы 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

    Запишите идентификатор сообщения из журналов.

  3. Проверьте журналы обработчика сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log) , чтобы узнать, есть ли у вас messaging.adaptors.http.flow.ApplicationNotFound для конкретного API или уникальный идентификатор сообщения из шага 2 для запроса к API.

    Пример сообщения об ошибке из журнала обработчика сообщений.

  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-прокси. Наличие неоднозначных определений, таких как несколько виртуальных хостов с одним и тем же псевдонимом хоста и номером порта, является известным антипаттерном и может привести к неожиданному поведению. Одна из распространенных ошибок, которую вы можете наблюдать, — это ошибка 404 с сообщением Unable to identify proxy for host: VIRTUAL_HOST and url: PATH .

Как правило, если существует несколько виртуальных хостов с одним и тем же псевдонимом, вы будете наблюдать периодические ошибки 404 Это происходит потому, что конкретный API-прокси может быть настроен на прием запросов только к одному из виртуальных хостов. Когда запросы API направляются к конкретному виртуальному хосту, настроенному в API-прокси, вы получите успешный ответ. Однако, когда запросы API направляются к другим виртуальным хостам, для которых API-прокси не настроен на прием запросов, API будут завершаться с ошибками 404 .

Следуйте инструкциям, приведенным в сообщении об ошибке 404 «Не удалось идентифицировать прокси для хоста: <имя виртуального хоста> и URL: <путь>», и устраните эту ошибку. Если ни одна из причин не приводит к этой ошибке, выполните следующие шаги, чтобы определить, вызывают ли ошибки 404 виртуальные хосты с повторяющимися псевдонимами хостов.

Диагноз

Для определения наличия нескольких виртуальных хостов с одинаковым псевдонимом хоста/номером порта, приводящих к ошибкам 404 используйте один из следующих методов:

  • Edge UI
  • API управления

Edge UI

Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста/номером порта, используя пользовательский интерфейс Edge.

Например, если вы наблюдали ошибку 404 при использовании URL-адреса http://example.com:9001/proxy1 , то вам необходимо выяснить, какие виртуальные хосты имеют псевдоним хоста example.com и порт 9001 .

  1. В публичном облаке и новом пользовательском интерфейсе Edge в частном облаке :
    1. Выберите Администратор .
    2. Выберите виртуальные хосты .
    3. Для каждой среды используйте фильтр поиска, чтобы определить виртуальные хосты , соответствующие конкретному псевдониму хоста, с помощью которого были вызваны запросы API.
    4. Если вы обнаружили, что несколько виртуальных хостов используют один и тот же псевдоним хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.

    Например:

  2. В классическом пользовательском интерфейсе в частном облаке :
    1. Выберите вкладку API .
    2. Выберите «Конфигурация среды» .
    3. Выберите виртуальные хосты .
    4. Для каждой среды просмотрите список виртуальных хостов , чтобы проверить, соответствуют ли какие-либо из них конкретному псевдониму хоста, с помощью которого были вызваны запросы API.
    5. Если вы обнаружили несколько виртуальных хостов с одинаковым псевдонимом хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.

    Например:

API управления

Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста/номером порта, используя API управления.

  1. Получите описание каждого виртуального хоста в каждой из сред вашей организации, чтобы увидеть, какие виртуальные хосты имеют одинаковый псевдоним хоста и номер порта:

    Например, если вы наблюдали ошибку 404 при использовании URL-адреса 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
      

      Пользователь частного облака:

      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
      

      Пользователь частного облака:

      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
      

      Пользователь частного облака:

      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 в двух разных средах, test и dev , и оба содержат один и тот же псевдоним хоста example.com и номер порта 9001 Это и является причиной ошибок 404 .

    5. Если вы обнаружили несколько виртуальных хостов с одинаковым псевдонимом хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.

Разрешение

  1. Убедитесь, что каждый виртуальный хост содержит только уникальные комбинации псевдонимов хостов и портов.
  2. Если вы обнаружили несколько виртуальных хостов с одинаковыми комбинациями псевдонимов хостов и портов, необходимо обновить их, присвоив им уникальные псевдонимы хостов.
  3. Обновить их можно с помощью пользовательского интерфейса Edge или 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 :

Если вы являетесь пользователем публичного облака , предоставьте следующую информацию:

  • Название организации
  • Название среды
  • Имя API-прокси
  • Выполните команду curl для воспроизведения ошибки 404
  • Если ошибки 404 в настоящее время не возникают, укажите период времени с информацией о часовом поясе, когда ошибки 404 возникали в прошлом.

Если вы являетесь пользователем частного облака , предоставьте следующую информацию:

  • Полное сообщение об ошибке, полученное для неудачных запросов.
  • Название организации, среды и имя 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