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

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

Symptom

Клиентское приложение получает код статуса HTTP 404 с сообщением Not Found и сообщением об ошибке Unable to identify proxy for host: VIRTUAL_HOST and url: PATH в ответ на вызовы API.

Эта ошибка означает, что 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

Распространенные этапы диагностики

Для устранения ошибки 404 могут пригодиться журналы NGINX и Message Processor. Чтобы проверить журналы, выполните следующие действия:

  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. Проверьте журналы Message Processor (/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 Unable to identify proxy for host: <имя виртуального хоста> and url: <путь> и устраните ошибку. Если ни одна из причин не подходит, выполните описанные ниже действия, чтобы определить, не вызваны ли ошибки 404 виртуальными хостами с повторяющимися псевдонимами хостов.

диагностика;

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

  • Интерфейс Edge
  • Management API

Интерфейс Edge

Следуйте этим инструкциям, чтобы определить, есть ли несколько виртуальных хостов с одним и тем же псевдонимом хоста или номером порта, используя интерфейс 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. Если вы обнаружите несколько виртуальных хостов, соответствующих одному и тому же псевдониму хоста, перейдите к разделу Решение.

    Пример

Management 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 или 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.

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

  • Название организации
  • Название среды
  • Название прокси 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.