Сервис недоступен (ошибка 503).

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

Видео

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

Видео Описание
Как устранить ошибку 503 (сервис недоступен) из-за проблем с DNS Узнайте больше о следующих темах:
  • Ошибка 503 "Сервис недоступен", вызванная проблемами с DNS-преобразованием и сетью в Apigee Edge
  • Устранение неполадок и ошибок 503 (сервис недоступен) в реальном времени, вызванных проблемами с DNS-преобразованием
Как устранить ошибку 503 "Сервис недоступен" из-за проблем с сетью Устранение неполадок и решение проблемы с ошибкой 503 "Сервис недоступен" в реальном времени, вызванной проблемами с сетью в Apigee Edge

Symptom

Клиентское приложение получает код статуса 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 возникает, если Message Processor Apigee Edge сталкивается с ошибками из-за истечения времени ожидания подключения, неправильного имени хоста или сбоев при установлении защищенного соединения SSL при взаимодействии с бэкенд-сервером.

Возможные причины ответа 503 Service Unavailable:

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

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

Как определить идентификатор сообщения для запроса, который не удалось выполнить

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

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

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

    Идентификатор сообщения в разделе "Сведения об этапе"

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

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

Чтобы определить идентификатор сообщения для ошибок 503, можно также обратиться к журналам доступа NGINX. Это особенно полезно, если проблема возникала в прошлом или возникает периодически и вы не можете записать трассировку в интерфейсе. Чтобы получить эту информацию из журналов доступа 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 messaging.adaptors.http.flow.ServiceUnavailable, запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:

    Пример записи с ошибкой 503

    Пример записи с кодом статуса, идентификатором сообщения, источником ошибки и кодом ошибки

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

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

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

    Ошибка onConnectTimeout означает, что Message Processor не смог подключиться к бэкенд-серверу в течение заданного времени ожидания (по умолчанию 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-адрес действителен, перейдите к разделу Ошибки подключения.
  4. Если IP-адрес недействителен, скорее всего, это связано с проблемами с разрешением DNS.
  5. Повторите шаги 3 и 4 для нескольких других неудачных запросов API и проверьте, видите ли вы те же или другие недействительные IP-адреса.
  6. Найдите в журнале Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log) сообщения с ключевым словом DNS Refresh. Проверьте, не добавляются ли в DNS-кеш на Message Processor время от времени недействительные IP-адреса.
    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 Message Processor.
    1. Если проблема с авторитетными DNS-серверами или серверами доменных имен, указанными в /etc/resolv.conf, не устранена, то недействительные IP-адреса будут и дальше оставаться в кеше DNS Message Processor. Пока неверные IP-адреса хранятся в кеше DNS Message Processor, запросы ко всем API, использующим определенный бэкенд-сервер, будут завершаться ошибкой 503.
    2. Если проблема с авторитетными DNS-серверами или серверами доменных имен, указанными в /etc/resolv.conf, возникает время от времени, то в кеше DNS будут периодически сохраняться как хорошие, так и плохие IP-адреса. В этом случае вы будете периодически получать ошибки 503 для всех API, использующих определенный сервер.
  9. Если проблема с DNS-серверами не устранена, вы будете постоянно видеть ошибки. Если проблема с DNS-серверами возникает время от времени, то и ошибки будут появляться время от времени. То есть всякий раз, когда имя хоста внутреннего сервера разрешается в неправильные IP-адреса, вы видите ошибки 503. Если имена хостов внутреннего сервера будут разрешены в действительные IP-адреса, вы увидите успешные ответы.

Разрешение

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

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

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

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

  • Message Processor не может подключиться в течение заданного времени ожидания подключения. Значение по умолчанию: 3 секунды.
  • Внутренний сервер отклоняет подключение.

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

  1. Определите идентификатор сообщения, вызвавшего ошибку.
  2. Найдите идентификатор сообщения запроса в журнале Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log). Вы можете увидеть следующие ошибки:
    1. Ошибка onConnectTimeout означает, что Message Processor не удалось подключиться к бэкенд-серверу в течение заданного времени ожидания подключения.
      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: Connection refused означает, что внутренний сервер отклонил подключение.
      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-адресам обработчика сообщений на определенном внутреннем сервере, чтобы разрешить трафику от обработчиков сообщений Edge доступ к внутреннему серверу. Например, в 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, в котором указана причина ошибки, как показано в следующем примере:

    Пример запроса, в трассировке которого указана причина ошибки

    Пример запроса, в трассировке которого указана причина ошибки
  6. Если в поле error.cause указано Host not reachable, то ошибка, скорее всего, вызвана одной из следующих причин:
    • Имя хоста, указанное в конфигурации целевого сервера или конечной точки, неверно или содержит лишние пробелы или специальные символы.

      Например, в имени хоста есть лишний пробел, как показано ниже:
      "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. Найдите идентификатор сообщения в журнале Message Processor. (/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. После этого может появиться сообщение о том, что Message Processor не работает из-за исключения "Хост недоступен". Иногда в сообщении об ошибке указывается имя хоста:
    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. Иногда вместо имени хоста может быть указано значение 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 {}
    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. Определите имя хоста целевого сервера, с которым пытается установить связь Message Processor, одним из следующих способов:
    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 "Сервис недоступен" может возникнуть при входящем или исходящем подключении:

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

Если вы используете общедоступное облако Edge, вам, вероятно, неизвестны внутренние компоненты, такие как маршрутизатор или Message Processor. Эти внутренние компоненты не видны и недоступны пользователям общедоступного облака. По возможности мы предлагаем альтернативные способы устранения неполадок, не требующие прямого доступа к этим компонентам.

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

Поток клиентского приложения (подключение к северу) через Edge к серверу бэкэнда (подключение к югу)

Как определить, где произошла ошибка 503: сервис недоступен

Чтобы определить, где произошла ошибка 503 (Сервис недоступен), в исходящем или входящем подключении, выполните одно из следующих действий.

Трассировка интерфейса

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

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

Мониторинг API

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

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

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

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

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

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