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

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

Симптом

Клиентское приложение получает код состояния 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 Public и Private Cloud

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

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

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

  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 :

  • Пограничный интерфейс
  • API управления

Пограничный интерфейс

Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста или номером порта с помощью пользовательского интерфейса 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 :

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

  • Название организации
  • Имя среды
  • Имя 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