Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Видео
Дополнительные сведения об ошибках 503 см. в следующих видеороликах:
Видео | Описание |
---|---|
Устранение и устранение ошибки 503 «Служба недоступна» из-за проблемы с 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 |
Общие этапы диагностики
Определите идентификатор сообщения неудачного запроса.
Инструмент трассировки
Чтобы определить идентификатор сообщения неудачного запроса с помощью инструмента трассировки:
- Если проблема все еще активна, включите сеанс трассировки для затронутого API.
- Выполните вызов API и воспроизведите проблему — 503 Служба недоступна с кодом ошибки
messaging.adaptors.http.flow.ServiceUnavailable.
- Выберите один из невыполненных запросов.
- Перейдите к этапу AX и определите идентификатор сообщения (
X-Apigee.Message-ID
) запроса, прокрутив вниз раздел «Сведения о этапе» , как показано на следующем рисунке.
Журналы доступа NGINX
Чтобы определить идентификатор сообщения неудачного запроса с помощью журналов доступа NGINX:
Вы также можете обратиться к журналам доступа NGINX, чтобы определить идентификатор сообщения для ошибок 503. Это особенно полезно, если проблема возникала в прошлом или если проблема носит периодический характер и вы не можете отследить ее в пользовательском интерфейсе. Используйте следующие шаги, чтобы получить эту информацию из журналов доступа NGINX:
- Проверьте журналы доступа NGINX: (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log
) - Найдите ошибки 503 для конкретного прокси-сервера API в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой 503.
- Если есть какие-либо ошибки 503 с X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:
Пример записи, показывающий ошибку 503
Ошибки подключения из-за неправильного разрешения DNS
Диагностика
- Определите идентификатор сообщения неудачного запроса.
- Найдите конкретный идентификатор сообщения запроса в журнале процессора сообщений (
/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)
- Обратите внимание на разрешенный IP-адрес в ошибке onConnectTimeout и проверьте, действителен ли IP-адрес для вашего внутреннего сервера. Если IP-адрес действителен, перейдите в раздел «Ошибки подключения» .
- Если IP-адрес недействителен, скорее всего, это может быть вызвано проблемами с разрешением DNS.
- Повторите шаги 3 и 4 для еще нескольких неудачных запросов API и проверьте, видите ли вы тот же или другие недействительные IP-адреса.
- Найдите в журнале процессора сообщений (
/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]
- Эта проблема может возникнуть, если есть какие-либо проблемы с авторитетными DNS-серверами или серверами имен, настроенными в
/etc/resolv.conf
.
Обычно для выполнения разрешения DNS может быть настроен один или несколько авторитетных DNS-серверов. Если авторитетных DNS-серверов нет, необходимо вернуться к настройке конфигурации в/etc/resolv.conf
и выполнить разрешение DNS соответствующим образом. Например: если файл/etc/resolv.conf
настроен на использование определенных серверов имен, то эти серверы имен будут использоваться для разрешения DNS. - Если есть какие-либо проблемы с авторитетными DNS-серверами или серверами имен, указанными в
/etc/resolv.conf
, имена хостов внутренних серверов будут преобразованы в неверные/недопустимые IP-адреса. Плохие/недействительные IP-адреса будут затем сохранены в кэше DNS процессора сообщений.- Если проблема с авторитетными DNS-серверами или серверами имен, указанными в
/etc/resolv.conf
, сохраняется, то плохие/недействительные IP-адреса будут продолжать оставаться в кэше DNS процессора сообщений. Пока неправильные IP-адреса хранятся в кэше DNS процессора сообщений, запросы ко всем этим API, использующим определенный внутренний сервер, завершаются ошибкой 503. - Если проблема с авторитетными DNS-серверами или серверами имен, указанными в
/etc/resolv.conf
, носит периодический характер, то хорошие и плохие IP-адреса будут периодически сохраняться в кэше DNS. В этом случае вы будете периодически видеть ошибки 503 для всех API, использующих конкретный внутренний сервер.
- Если проблема с авторитетными DNS-серверами или серверами имен, указанными в
- Если проблема с DNS-серверами постоянная, то вы увидите постоянные сбои. Если проблема с DNS-серверами носит периодический характер, вы увидите периодические сбои. То есть всякий раз, когда имя хоста внутреннего сервера разрешается в неверные IP-адреса, вы наблюдаете ошибку 503. А когда имена хостов внутренних серверов будут преобразованы в правильные IP-адреса, вы увидите успешные ответы.
Разрешение
Обратитесь к администратору операционной системы и устраните проблемы с DNS-серверами.
- Если возникла проблема с вашими авторитетными DNS-серверами или серверами имен, указанными в
/etc/resolv.conf
, устраните проблему с помощью соответствующего сервера, чтобы решить эту проблему. - Если есть какие-либо проблемы с конфигурацией в
/etc/resolv.conf
в системах с процессорами сообщений, устраните проблему с конфигурацией.
Ошибки подключения
Ошибка подключения возникает, когда процессор сообщений Apigee Edge пытается подключиться к внутреннему серверу, и возникает одна из этих проблем:
- Процессор сообщений не может подключиться в течение заданного периода ожидания соединения. (По умолчанию: 3 секунды)
- Внутренний сервер отклоняет соединение.
Диагностика
- Определите идентификатор сообщения неудачного запроса.
- Найдите конкретный идентификатор сообщения запроса в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). Вы можете наблюдать следующие ошибки:- Ошибка 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)
- Ошибка 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]
- Ошибка onConnectTimeout указывает на то, что процессору сообщений не удалось подключиться к внутреннему серверу в течение заданного периода ожидания соединения.
- Проверьте, можете ли вы подключиться к конкретному внутреннему серверу напрямую с каждого из процессоров сообщений с помощью команды
telnet
:- Если внутренний сервер разрешает один IP-адрес, используйте следующую команду:
telnet BackendServer-IPaddress 443
- Если внутренний сервер разрешает несколько IP-адресов, используйте имя хоста внутреннего сервера в команде
telnet
, как показано ниже:telnet BackendServer-HostName 443
- Если внутренний сервер разрешает один IP-адрес, используйте следующую команду:
- Если вы можете подключиться к внутреннему серверу, вы можете увидеть сообщение типа «
Connected to backend-server
. Если вам не удается подключиться к внутреннему серверу, это может быть связано с тем, что IP-адреса процессоров сообщений не включены в список разрешенных на конкретном внутреннем сервере.
Разрешение
Предоставьте доступ к IP-адресам процессора сообщений на определенном внутреннем сервере, чтобы разрешить трафику от пограничных процессоров сообщений получать доступ к вашему внутреннему серверу. Например, в Linux вы можете использовать iptables , чтобы разрешить трафик с IP-адресов процессора сообщений на внутреннем сервере.
Если проблема не устранена, обратитесь к своему сетевому администратору, чтобы определить и устранить проблему. Если вам нужна дополнительная помощь от Apigee, обратитесь в службу поддержки Apigee .
Неверное имя хоста целевого сервера.
Диагностика
Если имя хоста, указанное на целевом сервере, неверно, вы можете получить ответ 503 Service Unavailable с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable.
Инструмент трассировки
Для диагностики с помощью инструмента «Трассировка»:
- Если проблема все еще активна, включите сеанс трассировки для затронутого API.
- Выполните вызов API и воспроизведите проблему — 503 Служба недоступна с кодом ошибки
messaging.adaptors.http.flow.ServiceUnavailable.
- Выберите один из невыполненных запросов.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
- Выберите FlowInfo , в котором есть ошибка. В поле error.cause вы можете найти дополнительную информацию, которая может указать причину сбоя, как показано в следующем примере:
Пример запроса, показывающий error.cause в трассировке
- Если вы заметили, что error.cause показывает, что хост недоступен, вероятной причиной ошибки является одна из следующих:
- Имя хоста, указанное в конфигурации целевого сервера/целевой конечной точки, неверно или содержит нежелательные пробелы или специальные символы.
Например, в имени хоста есть нежелательный пробел, как показано ниже:"demo-target.apigee.net "
- Имя хоста, перезаписанное переменной target.url в прокси-сервере API с использованием политики AssignMessage или JavaScript , неверно или содержит пробелы или другие нежелательные специальные символы.
- Имя хоста, указанное в конфигурации целевого сервера/целевой конечной точки, неверно или содержит нежелательные пробелы или специальные символы.
- Проверьте конфигурацию целевой конечной точки и/или определение целевого сервера, чтобы убедиться, что имя хоста целевого сервера неверно и содержит нежелательные пробелы или специальные символы.
- Если хост целевого сервера создается динамически, проверьте соответствующую политику (например, политику AssignMessage/JavaScript ), использованную для его создания. Проверьте, не является ли имя хоста целевого сервера неправильным, содержит ли нежелательные пробелы или специальные символы.
- Определив имя хоста целевого сервера, запустите команду
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
- Если команде операционной системы
nslookup
также не удается разрешить имя хоста, то причиной этой проблемы является неправильное имя хоста, используемое для целевого сервера.Перейдите в раздел «Решение» .
Журналы процессора сообщений
Для диагностики с использованием журналов обработчика сообщений:
- Определите идентификатор сообщения неудачного запроса .
- Найдите идентификатор сообщения в журнале процессора сообщений. (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) - Если вы видите следующие предупреждения/сообщения об ошибках, процессор сообщений не смог разрешить имя хоста. Поскольку сообщение будет отложено, вы можете не увидеть это предупреждающее сообщение для всех идентификаторов сообщений/запросов.
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
- За этим последует предупреждающее сообщение, в котором процессор сообщений удаляет адрес из кэша 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
- Затем вы можете увидеть сообщение о сбое процессора сообщений с исключением «Хост недоступен». Иногда имя хоста отображается как часть сообщения об ошибке:
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>
- Иногда оно может отображаться как нулевое, поскольку имя хоста не может быть разрешено или доступно, как показано ниже:
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>
- Ошибка
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 , неверно или содержит пробелы или другие нежелательные специальные символы.
- Имя хоста, указанное в конфигурации целевого сервера/целевой конечной точки, неверно или содержит нежелательные пробелы или специальные символы.
- Определите имя хоста целевого сервера, с которым процессор сообщений пытается связаться, используя одно из следующих действий:
- Внимательно изучите сообщение об ошибке, содержащее
Host not reachable
. - Если в сообщении об ошибке указано имя хоста, скопируйте имя хоста, включая пробелы и специальные символы.
- Если в сообщении об ошибке для имени хоста указано значение 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 {}
- Определите имя хоста, проверив определение целевого сервера, используемое в неисправном прокси-сервере API.
- Если хост целевого сервера создается динамически, проверьте соответствующую политику (например, политику AssignMessage/JavaScript ), использованную для его создания.
- Определив имя хоста целевого сервера, запустите команду 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
- Если команде операционной системы nslookup также не удается разрешить имя хоста, то причиной этой проблемы является неправильное имя хоста, используемое для целевого сервера.
Разрешение
- Убедитесь, что имя хоста целевого сервера, указанное в конфигурации целевой конечной точки или в определении целевого сервера , правильное и не содержит нежелательных пробелов или специальных символов.
- Если вы используете какую-либо политику AssignMessage/JavaScript для динамического создания имени хоста целевого сервера, изучите определение политики и код и убедитесь, что имя хоста целевого сервера генерируется правильно.
Ошибки подтверждения SSL
Целая книга по устранению неполадок посвящена ошибкам установления связи TLS/SSL. См. раздел «Ошибки установления связи SSL» .
Определение источника проблемы
Определенные типы ошибок могут возникать как во входящем (северном), так и исходящем (южном) соединении. Между клиентским приложением и Edge возникает входящая (северная) ошибка. Между Edge и внутренним целевым сервером возникает исходящая (южная) ошибка. Чтобы диагностировать такого рода проблемы, ваша первая задача — выяснить, возникает ли ошибка в северном или южном соединении.
Понимание соединений в северном и южном направлении
В Edge вы можете столкнуться с ошибкой 503 Service Unavailable как при входящем, так и при исходящем соединении:
- Входящее (или северное) соединение — соединение между клиентским приложением и пограничным маршрутизатором. Маршрутизатор — это компонент Apigee Edge, который обрабатывает входящие запросы, поступающие в систему.
- Исходящее (или южное) соединение — соединение между пограничным процессором сообщений и внутренним сервером. Процессор сообщений — это компонент Apigee Edge, который передает запросы API на внутренние целевые серверы.
Если вы являетесь пользователем Edge Public Cloud, вы, вероятно, не знаете о внутренних компонентах, таких как маршрутизатор или процессор сообщений. Эти внутренние компоненты не видны и не доступны пользователям Public Cloud. Там, где это возможно, мы предоставляем альтернативные способы исследования проблемы, не требующие прямого доступа к этим компонентам.
На следующем рисунке показаны соединения Apigee Edge в северном и южном направлении.
Определение места возникновения ошибки 503 Service Unavailable
Используйте одну из следующих процедур, чтобы определить, возникла ли ошибка 503 Service Unavailable в северном или южном соединении.
Трассировка пользовательского интерфейса
Чтобы определить, где произошла ошибка, с помощью UI Trace:
- Если проблема все еще активна, включите трассировку пользовательского интерфейса для затронутого API.
- Если трассировка пользовательского интерфейса для неудачного запроса API показывает, что ошибка 503 Service Unavailable возникает во время целевого потока запросов или отправляется внутренним сервером, то проблема связана с югом (то есть между процессором сообщений и внутренним сервером).
- Если вы не получаете трассировку для конкретного вызова API, значит, проблема связана с севером , между клиентским приложением и маршрутизатором.
API-мониторинг
Мониторинг API позволяет быстро изолировать проблемные области для диагностики ошибок, проблем с производительностью и задержкой, а также их источников, таких как приложения для разработчиков, прокси-серверы API, целевые серверные части или платформа API.
Ознакомьтесь с примером сценария , который демонстрирует, как устранять проблемы 5xx с вашими API с помощью мониторинга API. Например, вы можете настроить оповещение, которое будет уведомляться, когда количество ошибок messaging.adaptors.http.flow.ServiceUnavailable
превышает определенный порог.
Журналы доступа NGINX
Чтобы определить, где произошла ошибка, с помощью UI Trace:
Если проблема возникала в прошлом или если проблема носит периодический характер и вы не можете отследить ее, выполните следующие действия:
- Проверьте журналы доступа NGINX (
/opt/apigee/var/log/edge-router/nginx/ org - env . port _access_log
). - Найдите ошибки 503 для конкретного прокси-сервера API.
- Если вы можете определить какие-либо ошибки 503 для конкретного API в определенное время, значит, проблема возникла в южном соединении (между процессором сообщений и внутренним сервером).
- Если нет, то проблема возникла в северном соединении (между клиентским приложением и маршрутизатором).