503 Сервис недоступен

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

Видео

Дополнительные сведения об ошибках 503 см. в следующих видеороликах:

Видео Описание
Устранение и устранение ошибки 503 «Служба недоступна» из-за проблемы с DNS Узнайте о следующем:
  • Ошибка 503 Service Unavailable, вызванная разрешением DNS и проблемами, связанными с сетью в Apigee Edge.
  • Устранение и устранение ошибки 503 Service Unavailable в режиме реального времени, вызванной проблемой разрешения DNS
Устранение и устранение ошибки 503 «Служба недоступна» из-за проблемы с сетью Устранение и устранение ошибки 503 Service Unavailable в режиме реального времени, вызванной проблемой сети в Apigee Edge

Симптом

Клиентское приложение получает статус ответа HTTP 503 с сообщением «Служба недоступна» после вызова прокси-сервера API.

Сообщения об ошибках

Вы можете увидеть следующее сообщение об ошибке:

HTTP/1.1 503 Service Unavailable
      

Вы также можете увидеть следующее сообщение об ошибке в ответе HTTP:

Сервис недоступен

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}
      

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

HTTP-ответ 503 Service Unavailable с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable возникает, если процессор сообщений Apigee Edge испытывает ошибки из-за тайм-аута соединения, неправильного имени хоста или сбоев подтверждения SSL при обмене данными с внутренним сервером.

Возможные причины ответа 503 «Служба недоступна» :

Причина Описание Кто может выполнять действия по устранению неполадок
Ошибки подключения из-за неправильного разрешения DNS Разрешение DNS целевого сервера привело к получению неверных IP-адресов, что привело к ошибкам подключения. Пользователи Edge Private Cloud
Ошибки подключения Проблемы с сетью или подключением не позволяют клиенту подключиться к серверу. Пользователи Edge Private Cloud
Неверное имя хоста целевого сервера. Указанный хост целевого сервера неверен или содержит нежелательные символы (например, пробел). Пользователи Edge Public и Private Cloud
Ошибки подтверждения SSL Не удалось установить соединение TLS/SSL между клиентом и сервером. (Устранение неполадок этого класса проблем описано в отдельной теме.) Пользователи Edge Public и Private Cloud

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

Определите идентификатор сообщения неудачного запроса.

Инструмент трассировки

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

  1. Если проблема все еще активна, включите сеанс трассировки для затронутого API.
  2. Выполните вызов API и воспроизведите проблему — 503 Служба недоступна с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable.
  3. Выберите один из невыполненных запросов.
  4. Перейдите к этапу AX и определите идентификатор сообщения ( X-Apigee.Message-ID ) запроса, прокрутив вниз раздел «Сведения о этапе» , как показано на следующем рисунке.

    Message ID in Phase Details section

Журналы доступа NGINX

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

Вы также можете обратиться к журналам доступа NGINX, чтобы определить идентификатор сообщения для ошибок 503. Это особенно полезно, если проблема возникала в прошлом или если проблема носит периодический характер и вы не можете отследить ее в пользовательском интерфейсе. Используйте следующие шаги, чтобы получить эту информацию из журналов доступа NGINX:

  1. Проверьте журналы доступа NGINX: ( /opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log )
  2. Найдите ошибки 503 для конкретного прокси-сервера API в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой 503.
  3. Если есть какие-либо ошибки 503 с X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:

    Пример записи, показывающий ошибку 503

    Sample entry showing status code, message ID, fault source, and fault code

Ошибки подключения из-за неправильного разрешения DNS

Диагностика

  1. Определите идентификатор сообщения неудачного запроса.
  2. Найдите конкретный идентификатор сообщения запроса в журнале процессора сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log ). Вы можете наблюдать следующие ошибки:

    Ошибка onConnectTimeout указывает на то, что процессору сообщений не удалось подключиться к внутреннему серверу в течение заданного периода ожидания соединения (по умолчанию: 3 секунды).
    2019-08-14 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[Connected:]@164162 useCount=1 bytesRead=0 bytesWritten=0 age=3001ms lastIO=3001ms .onConnectTimeout connectAddress=www.abc.com/11.11.11.11  resolvedAddress=www.abc.com/22.22.22.22
    
    2019-08-14 09:11:49,333 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onTimeout() : RequestWriteListener.onTimeout(HTTPRequest@6b393600)
          
  3. Обратите внимание на разрешенный IP-адрес в ошибке onConnectTimeout и проверьте, действителен ли IP-адрес для вашего внутреннего сервера. Если IP-адрес действителен, перейдите в раздел «Ошибки подключения» .
  4. Если IP-адрес недействителен, скорее всего, это может быть вызвано проблемами с разрешением DNS.
  5. Повторите шаги 3 и 4 для еще нескольких неудачных запросов API и проверьте, видите ли вы тот же или другие недействительные IP-адреса.
  6. Найдите в журнале процессора сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log ) сообщения с ключевым словом DNS Refresh . Время от времени проверяйте, не добавляются ли плохие или недействительные IP-адреса в кэш DNS процессора сообщений.
    2019-08-14 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 INFO c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.reportDifferences() : DNS Refresh for host: apitarget-uat.schemeweb.co.uk:4436. Added 2 IPs [www.abc.com/22.22.22.22, www.abc.com/33.33.33.33] Removed 1 IPs [www.abc.com/11.11.11.11]
          
  7. Эта проблема может возникнуть, если есть какие-либо проблемы с авторитетными DNS-серверами или серверами имен, настроенными в /etc/resolv.conf .

    Обычно для выполнения разрешения DNS может быть настроен один или несколько авторитетных DNS-серверов. Если авторитетных DNS-серверов нет, необходимо вернуться к настройке конфигурации в /etc/resolv.conf и выполнить разрешение DNS соответствующим образом. Например: если файл /etc/resolv.conf настроен на использование определенных серверов имен, то эти серверы имен будут использоваться для разрешения DNS.
  8. Если есть какие-либо проблемы с авторитетными DNS-серверами или серверами имен, указанными в /etc/resolv.conf , имена хостов внутренних серверов будут преобразованы в неверные/недопустимые IP-адреса. Плохие/недействительные IP-адреса будут затем сохранены в кэше DNS процессора сообщений.
    1. Если проблема с авторитетными DNS-серверами или серверами имен, указанными в /etc/resolv.conf , сохраняется, то плохие/недействительные IP-адреса будут продолжать оставаться в кэше DNS процессора сообщений. Пока неправильные IP-адреса хранятся в кэше DNS процессора сообщений, запросы ко всем этим API, использующим определенный внутренний сервер, завершаются ошибкой 503.
    2. Если проблема с авторитетными DNS-серверами или серверами имен, указанными в /etc/resolv.conf , носит периодический характер, то хорошие и плохие IP-адреса будут периодически сохраняться в кэше DNS. В этом случае вы будете периодически видеть ошибки 503 для всех API, использующих конкретный внутренний сервер.
  9. Если проблема с DNS-серверами постоянная, то вы увидите постоянные сбои. Если проблема с DNS-серверами носит периодический характер, вы увидите периодические сбои. То есть всякий раз, когда имя хоста внутреннего сервера разрешается в неверные IP-адреса, вы наблюдаете ошибку 503. А когда имена хостов внутренних серверов будут преобразованы в правильные IP-адреса, вы увидите успешные ответы.

Разрешение

Обратитесь к администратору операционной системы и устраните проблемы с DNS-серверами.

  1. Если возникла проблема с вашими авторитетными DNS-серверами или серверами имен, указанными в /etc/resolv.conf , устраните проблему с помощью соответствующего сервера, чтобы решить эту проблему.
  2. Если есть какие-либо проблемы с конфигурацией в /etc/resolv.conf в системах с процессорами сообщений, устраните проблему с конфигурацией.

Ошибки подключения

Ошибка подключения возникает, когда процессор сообщений Apigee Edge пытается подключиться к внутреннему серверу, и возникает одна из этих проблем:

  • Процессор сообщений не может подключиться в течение заданного периода ожидания соединения. (По умолчанию: 3 секунды)
  • Внутренний сервер отклоняет соединение.

Диагностика

  1. Определите идентификатор сообщения неудачного запроса.
  2. Найдите конкретный идентификатор сообщения запроса в журнале процессора сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log ). Вы можете наблюдать следующие ошибки:
    1. Ошибка onConnectTimeout указывает на то, что процессору сообщений не удалось подключиться к внутреннему серверу в течение заданного периода ожидания соединения.
      2016-06-23 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[C:]@10 useCount=1 bytesRead=0 bytesWritten=0 age=3001ms lastIO=3001ms .onConnectTimeout connectAddress=www.abc.com/11.11.11.11:80 resolvedAddress=www.abc.com/11.11.11.11
      2016-06-23 09:11:49,333 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onTimeout() : RequestWriteListener.onTimeout(HTTPRequest@6b393600)
    2. Ошибка java.net.ConnectException: соединение отклонено указывает на то, что внутренний сервер отклонил соединение.
      14:40:16.531 +0530
      2016-06-17 09:10:16,531 org:myorg env:prod api:www.abc.com rev:1 rrt07eadn-22739-40983870-15 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() : connect to www.abc.com:11.11.11.11:443 failed with exception {}
      java.net.ConnectException: Connection refused
      at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_75]
      at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) ~[na:1.7.0_75]
      at com.apigee.nio.ClientChannel.finishConnect(ClientChannel.java:121) ~[nio-1.0.0.jar:na]
      at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:108) ~[nio-1.0.0.jar:na]
  3. Проверьте, можете ли вы подключиться к конкретному внутреннему серверу напрямую с каждого из процессоров сообщений с помощью команды telnet :
    1. Если внутренний сервер разрешает один IP-адрес, используйте следующую команду:
      telnet BackendServer-IPaddress 443
                
    2. Если внутренний сервер разрешает несколько IP-адресов, используйте имя хоста внутреннего сервера в команде telnet , как показано ниже:
      telnet BackendServer-HostName 443
                
  4. Если вы можете подключиться к внутреннему серверу, вы можете увидеть сообщение типа « Connected to backend-server . Если вам не удается подключиться к внутреннему серверу, это может быть связано с тем, что IP-адреса процессоров сообщений не включены в список разрешенных на конкретном внутреннем сервере.

Разрешение

Предоставьте доступ к IP-адресам процессора сообщений на определенном внутреннем сервере, чтобы разрешить трафику от пограничных процессоров сообщений получать доступ к вашему внутреннему серверу. Например, в Linux вы можете использовать iptables , чтобы разрешить трафик с IP-адресов процессора сообщений на внутреннем сервере.

Если проблема не устранена, обратитесь к своему сетевому администратору, чтобы определить и устранить проблему. Если вам нужна дополнительная помощь от Apigee, обратитесь в службу поддержки Apigee .

Неверное имя хоста целевого сервера.

Диагностика

Если имя хоста, указанное на целевом сервере, неверно, вы можете получить ответ 503 Service Unavailable с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable.

Инструмент трассировки

Для диагностики с помощью инструмента «Трассировка»:

  1. Если проблема все еще активна, включите сеанс трассировки для затронутого API.
  2. Выполните вызов API и воспроизведите проблему — 503 Служба недоступна с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable.
  3. Выберите один из невыполненных запросов.
  4. Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
  5. Выберите FlowInfo , в котором есть ошибка. В поле error.cause вы можете найти дополнительную информацию, которая может указать причину сбоя, как показано в следующем примере:

    Пример запроса, показывающий error.cause в трассировке

    Sample request showing error.cause in the trace
  6. Если вы заметили, что error.cause показывает, что хост недоступен, вероятной причиной ошибки является одна из следующих:
    • Имя хоста, указанное в конфигурации целевого сервера/целевой конечной точки, неверно или содержит нежелательные пробелы или специальные символы.

      Например, в имени хоста есть нежелательный пробел, как показано ниже:
      "demo-target.apigee.net "
                        
    • Имя хоста, перезаписанное переменной target.url в прокси-сервере API с использованием политики AssignMessage или JavaScript , неверно или содержит пробелы или другие нежелательные специальные символы.
  7. Проверьте конфигурацию целевой конечной точки и/или определение целевого сервера, чтобы убедиться, что имя хоста целевого сервера неверно и содержит нежелательные пробелы или специальные символы.
  8. Если хост целевого сервера создается динамически, проверьте соответствующую политику (например, политику AssignMessage/JavaScript ), использованную для его создания. Проверьте, не является ли имя хоста целевого сервера неправильным, содержит ли нежелательные пробелы или специальные символы.
  9. Определив имя хоста целевого сервера, запустите команду nslookup/dig для имени хоста, чтобы проверить, можно ли его разрешить.

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

    nslookup "demo-target.apigee.net "
    Server:	49.205.75.2
    Address:	49.205.75.2#53
    
    ** server can't find demo-target.apigee.net\032: NXDOMAIN
  10. Если команде операционной системы nslookup также не удается разрешить имя хоста, то причиной этой проблемы является неправильное имя хоста, используемое для целевого сервера.

    Перейдите в раздел «Решение» .

Журналы процессора сообщений

Для диагностики с использованием журналов обработчика сообщений:

  1. Определите идентификатор сообщения неудачного запроса .
  2. Найдите идентификатор сообщения в журнале процессора сообщений. ( /opt/apigee/var/log/edge-message-processor/logs/system.log )
  3. Если вы видите следующие предупреждения/сообщения об ошибках, процессор сообщений не смог разрешить имя хоста. Поскольку сообщение будет отложено, вы можете не увидеть это предупреждающее сообщение для всех идентификаторов сообщений/запросов.
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 WARN S.HTTPCLIENTSERVICE - DNSCache$2.failed() : Failed to resolve hostname www.somehost.com . Reason mocktarget.apigee.net : Name or service not known. This log message will snooze for 2 hours
        
  4. За этим последует предупреждающее сообщение, в котором процессор сообщений удаляет адрес из кэша DNS, поскольку хост целевого сервера не может быть достигнут.
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 WARN  c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.addressNotReachable() : The last address has been removed from Address list null refreshing
        
  5. Затем вы можете увидеть сообщение о сбое процессора сообщений с исключением «Хост недоступен». Иногда имя хоста отображается как часть сообщения об ошибке:
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to demo-target.apigee.net  failed with exception {}
    java.lang.RuntimeException: Host not reachable
    	at com.apigee.protocol.http.HTTPClient$Context.initConnect(HTTPClient.java:704)
    	at com.apigee.protocol.http.HTTPClient$Context.send(HTTPClient.java:675)
    	at com.apigee.messaging.adaptors.http.flow.data.TargetRequestSender.sendRequest(TargetRequestSender.java:234)
    	<snipped>
        
  6. Иногда оно может отображаться как нулевое, поскольку имя хоста не может быть разрешено или доступно, как показано ниже:
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to null failed with exception {}
    java.lang.RuntimeException: Host not reachable
    	at com.apigee.protocol.http.HTTPClient$Context.initConnect(HTTPClient.java:704)
    	at com.apigee.protocol.http.HTTPClient$Context.send(HTTPClient.java:675)
    	at com.apigee.messaging.adaptors.http.flow.data.TargetRequestSender.sendRequest(TargetRequestSender.java:234)
    	<snipped>
        
  7. Ошибка Host not reachable обычно возникает в одном из следующих случаев:
    • Имя хоста, указанное в конфигурации целевого сервера/целевой конечной точки, неверно или содержит нежелательные пробелы или специальные символы.

      Например, в следующем сообщении об ошибке в имени хоста «demo-target.apigee.net» есть нежелательный пробел:
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to demo-target.apigee.net  failed with exception
              
    • Имя хоста, перезаписанное переменной target.url в прокси-сервере API с использованием политики AssignMessage или JavaScript , неверно или содержит пробелы или другие нежелательные специальные символы.
  8. Определите имя хоста целевого сервера, с которым процессор сообщений пытается связаться, используя одно из следующих действий:
    1. Внимательно изучите сообщение об ошибке, содержащее Host not reachable .
    2. Если в сообщении об ошибке указано имя хоста, скопируйте имя хоста, включая пробелы и специальные символы.
    3. Если в сообщении об ошибке для имени хоста указано значение NULL , как показано в следующем сообщении об ошибке:
      org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to null failed with exception {}
              
      1. Определите имя хоста, проверив определение целевого сервера, используемое в неисправном прокси-сервере API.
      2. Если хост целевого сервера создается динамически, проверьте соответствующую политику (например, политику AssignMessage/JavaScript ), использованную для его создания.
  9. Определив имя хоста целевого сервера, запустите команду nslookup/dig для имени хоста и проверьте, можно ли его разрешить.

    Например, запустите команду nslookup для имени хоста, содержащего пробел.

    nslookup "demo-target.apigee.net "
    Server:	49.205.75.2
    Address:	49.205.75.2#53
    
    ** server can't find demo-target.apigee.net\032: NXDOMAIN
          
  10. Если команде операционной системы nslookup также не удается разрешить имя хоста, то причиной этой проблемы является неправильное имя хоста, используемое для целевого сервера.

Разрешение

  1. Убедитесь, что имя хоста целевого сервера, указанное в конфигурации целевой конечной точки или в определении целевого сервера , правильное и не содержит нежелательных пробелов или специальных символов.
  2. Если вы используете какую-либо политику AssignMessage/JavaScript для динамического создания имени хоста целевого сервера, изучите определение политики и код и убедитесь, что имя хоста целевого сервера генерируется правильно.

Ошибки подтверждения SSL

Целая книга по устранению неполадок посвящена ошибкам установления связи TLS/SSL. См. раздел «Ошибки установления связи SSL» .

Определение источника проблемы

Определенные типы ошибок могут возникать как во входящем (северном), так и исходящем (южном) соединении. Между клиентским приложением и Edge возникает входящая (северная) ошибка. Между Edge и внутренним целевым сервером возникает исходящая (южная) ошибка. Чтобы диагностировать такого рода проблемы, ваша первая задача — выяснить, возникает ли ошибка в северном или южном соединении.

Понимание соединений в северном и южном направлении

В Edge вы можете столкнуться с ошибкой 503 Service Unavailable как при входящем, так и при исходящем соединении:

  • Входящее (или северное) соединение — соединение между клиентским приложением и пограничным маршрутизатором. Маршрутизатор — это компонент Apigee Edge, который обрабатывает входящие запросы, поступающие в систему.
  • Исходящее (или южное) соединение — соединение между пограничным процессором сообщений и внутренним сервером. Процессор сообщений — это компонент Apigee Edge, который передает запросы API на внутренние целевые серверы.

Если вы являетесь пользователем Edge Public Cloud, вы, вероятно, не знаете о внутренних компонентах, таких как маршрутизатор или процессор сообщений. Эти внутренние компоненты не видны и не доступны пользователям Public Cloud. Там, где это возможно, мы предоставляем альтернативные способы исследования проблемы, не требующие прямого доступа к этим компонентам.

На следующем рисунке показаны соединения Apigee Edge в северном и южном направлении.

Flow of client application (northbound connection) through Edge to backend server (southbound connection)

Определение места возникновения ошибки 503 Service Unavailable

Используйте одну из следующих процедур, чтобы определить, возникла ли ошибка 503 Service Unavailable в северном или южном соединении.

Трассировка пользовательского интерфейса

Чтобы определить, где произошла ошибка, с помощью UI Trace:

  1. Если проблема все еще активна, включите трассировку пользовательского интерфейса для затронутого API.
  2. Если трассировка пользовательского интерфейса для неудачного запроса API показывает, что ошибка 503 Service Unavailable возникает во время целевого потока запросов или отправляется внутренним сервером, то проблема связана с югом (то есть между процессором сообщений и внутренним сервером).
  3. Если вы не получаете трассировку для конкретного вызова API, значит, проблема связана с севером , между клиентским приложением и маршрутизатором.

API-мониторинг

Мониторинг API позволяет быстро изолировать проблемные области для диагностики ошибок, проблем с производительностью и задержкой, а также их источников, таких как приложения для разработчиков, прокси-серверы API, целевые серверные части или платформа API.

Ознакомьтесь с примером сценария , который демонстрирует, как устранять проблемы 5xx с вашими API с помощью мониторинга API. Например, вы можете настроить оповещение, которое будет уведомляться, когда количество ошибок messaging.adaptors.http.flow.ServiceUnavailable превышает определенный порог.

Журналы доступа NGINX

Чтобы определить, где произошла ошибка, с помощью UI Trace:

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

  1. Проверьте журналы доступа NGINX ( /opt/apigee/var/log/edge-router/nginx/ org - env . port _access_log ).
  2. Найдите ошибки 503 для конкретного прокси-сервера API.
  3. Если вы можете определить какие-либо ошибки 503 для конкретного API в определенное время, значит, проблема возникла в южном соединении (между процессором сообщений и внутренним сервером).
  4. Если нет, то проблема возникла в северном соединении (между клиентским приложением и маршрутизатором).