Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Видео
Чтобы узнать больше об ошибках 503, посмотрите следующие видео:
| Видео | Описание |
|---|---|
| Как устранить ошибку 503 "Сервис недоступен" (NoActiveTargets) | Узнайте больше о следующих темах:
|
Symptom
Клиентское приложение получает код статуса HTTP-ответа 503 с сообщением Сервис недоступен и кодом ошибки NoActiveTargets для запросов прокси-сервера API.
Сообщение об ошибке
Вы увидите следующее сообщение об ошибке:
HTTP/1.1 503 Service Unavailable
В HTTP-ответе вы увидите следующее сообщение об ошибке:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.NoActiveTargets"
}
}
}
Возможные причины
HTTP-ответ 503 Service Unavailable с кодом ошибки NoActiveTargets обычно наблюдается, когда вы используете один или несколько целевых серверов в конфигурации целевой конечной точки в прокси-сервере API.
В этом руководстве рассматривается ошибка 503 Service Unavailable с кодом NoActiveTargets, которая возникает из-за сбоев при проверке состояния. Ознакомьтесь с этим руководством, чтобы узнать о других причинах этой ошибки.
Сбои при проверке работоспособности
Сбои проверки работоспособности будут наблюдаться только в том случае, если вы настроили монитор работоспособности как часть конфигурации балансировки нагрузки целевого сервера в целевой конечной точке прокси-сервера API.
Если целевой сервер не проходит проверку работоспособности, Edge увеличивает счетчик ошибок этого сервера.
Если количество неудачных проверок работоспособности для этого сервера достигнет заданного порога (<MaxFailures>), процессор сообщений запишет в файл журнала предупреждение, как показано ниже:
Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
В предупреждении содержится следующая информация:
Это поможет вам понять, какой целевой сервер достиг значения MaxFailure:
- Название целевого сервера
- Названия организации и среды
- Название прокси API
- Название целевой конечной точки
После этого Edge прекращает отправлять запросы на этот сервер. Когда все целевые серверы, настроенные в конфигурации LoadBalancer, достигают значения MaxFailure, на последующие запросы API возвращается ответ 503 Service Unavailable с кодом ошибки NoActiveTargets.
Использование монитора работоспособности позволяет Apigee Edge автоматически возвращать целевой сервер в ротацию, когда он становится работоспособным, без необходимости повторного развертывания прокси API.
Ниже перечислены возможные причины сбоев при проверке состояния.
| Причина | Описание | Кто может выполнять инструкции по устранению неполадок |
|---|---|---|
| Ошибка "Истекло время ожидания подключения" | Message Processor не может подключиться к целевому серверу в течение указанного в конфигурации балансировщика нагрузки времени ожидания. | Пользователи Edge Private Cloud |
| Безопасный запрос через небезопасный порт |
|
Пользователи Edge Private Cloud |
| Небезопасный запрос через безопасный порт |
|
Пользователи Edge Private Cloud |
| API проверки работоспособности возвращает ошибку | Если API проверки работоспособности возвращает ошибку или код ответа, отличный от указанного в элементе SuccessResponse монитора работоспособности. | Пользователи Edge Private Cloud |
Распространенные этапы диагностики
Как определить идентификатор сообщения для запроса, который не удалось выполнить
Инструмент "Трассировка"
Чтобы определить идентификатор сообщения для запроса, который не удалось выполнить, с помощью инструмента трассировки:
- Включите сеанс трассировки, выполните вызов API и воспроизведите проблему – 503 Service Unavailable с кодом ошибки NoActiveTargets.
- Выберите один из запросов, которые не удалось выполнить.
- Перейдите к фазе AX и определите идентификатор сообщения (
X-Apigee.Message-ID) запроса, прокрутив вниз раздел Сведения о фазе, как показано на рисунке ниже.
Журналы доступа NGINX
Чтобы определить идентификатор сообщения для запроса, который не удалось выполнить, с помощью журналов доступа NGINX:
Чтобы определить идентификатор сообщения для ошибок 503, можно также обратиться к журналам доступа NGINX. Это особенно полезно, если проблема возникала в прошлом или возникает периодически и вы не можете записать трассировку в интерфейсе. Чтобы получить эту информацию из журналов доступа NGINX, выполните следующие действия:
- Проверьте журналы доступа NGINX: (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log) - Проверьте, возникали ли ошибки 503 для определенного прокси-сервера API за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 503.
- Если возникают ошибки 503 с сообщением X-Apigee-fault-code messaging.adaptors.http.flow.NoActiveTargets, запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:
Пример записи с ошибкой 503
Распространенные сообщения об ошибках
Если используются целевые серверы и при попытке Message Processor подключиться к бэкенд-серверу возникает ошибка, в журналах Message Processor можно увидеть несколько распространенных сообщений об ошибках. Эти ошибки регистрируются после фактического исключения или сообщения об ошибке, приведших к сбою.
Распространенные сообщения об ошибках, которые можно найти в журналах Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log) для 503 Service Unavailable с кодом ошибки NoActiveTargets, приведены ниже.
org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 INFO ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Failed to send request to target servers : [demo-target] for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : No Active Target server Found for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Unexpected error while sending request com.apigee.errors.http.server.ServiceUnavailableException: The Service is temporarily unavailable at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.sendRequest(LBTargetRequestSender.java:299) at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.access$400(LBTargetRequestSender.java:57) …<snipped>
Эти сообщения об ошибках указывают на то, что запрос не удалось отправить на серверную часть из-за сбоя. В результате Message Processor отправляет клиенту ответ 503 Service Unavailable (Сервис недоступен) с кодом ошибки NoActiveTargets (Нет активных целей).
Причина: время ожидания подключения истекло
диагностика;
- Определите идентификатор сообщения, для которого не удалось выполнить запрос.
- Найдите идентификатор сообщения в журнале Message Processor (
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения. Однако, чтобы узнать истинную причину сбоев проверки состояния, прокрутите страницу вверх и найдите сообщения об ошибках, связанные с мониторингом состояния.
Например, следующее сообщение об ошибке HEALTH MONITOR указывает на то, что Message Processor не смог выполнить запрос к API для проверки состояния из-за ошибки с истечением времени ожидания подключения:
Apigee-Timer-6 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://<BackendServer-Hostname>:443/status java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) …<snipped>Если эта ошибка повторяется
MaxFailureраз (количество задано в мониторе работоспособности), вы увидите предупреждение, например:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}Внимательно прочитайте предупреждение. Убедитесь, что для целевого сервера, используемого в определенном прокси API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets, достигнуто значение счетчика
MaxFailure. - В примере выше проверка работоспособности не пройдена из-за ошибки
connection timed out. Проверьте, можете ли вы подключиться к определенному серверу напрямую с каждого процессора сообщений, используя командуtelnet: - Если вам удалось подключиться к внутреннему серверу, вы можете увидеть сообщение Подключено к внутреннему серверу. В таком случае проблема может быть временной и уже решена или возникать периодически. Повторите шаг 4 несколько раз (не менее 10) и проверьте результат.
- Если при выполнении команды
telnetошибки не возникают, проблема решена. Проверьте, прекратились ли сбои проверки состояния. Если да, то вам ничего делать не нужно. - Если вы не можете подключиться к внутреннему серверу с помощью команды
telnet, возможно, возникла проблема с сетью или сервер перегружен. - Если вы не можете подключиться к внутреннему серверу с помощью команды
telnet, возможно, это связано с тем, что трафик от процессоров сообщений не разрешен на этом сервере.
telnet <BackendServer-HostName> 443
Разрешение
Если ошибка connection timed out возникает постоянно, убедитесь, что на внутреннем сервере нет ограничений межсетевого экрана и он разрешает трафик от процессоров сообщений Apigee Edge.
Например, в Linux можно использовать iptables, чтобы разрешить трафик с IP-адресов процессора сообщений на внутреннем сервере.
Если проблема не исчезнет, обратитесь к администратору сети, чтобы определить и устранить ее. Если вам нужна помощь Apigee, обратитесь в службу поддержки Apigee.
Причина: безопасный запрос на небезопасный порт
диагностика;
- Определите идентификатор сообщения, для которого не удалось выполнить запрос.
- Найдите идентификатор сообщения в журнале Message Processor (
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения.
Чтобы узнать причину сбоев при проверке состояния, прокрутите страницу вверх и найдите сообщения об ошибках, связанные с мониторингом состояния.
Например, может появиться ошибка HEALTH MONITOR, как показано ниже:
Apigee-Timer-1 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://mocktarget.apigee.net:80/status javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710) at sun.security.ssl.InputRecord.read(InputRecord.java:527) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397) …<snipped>Если эта ошибка повторяется
MaxFailureраз (количество задано в инструменте мониторинга работоспособности), вы увидите предупреждение, например такое:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}Внимательно прочитайте предупреждение. Убедитесь, что для целевого сервера, используемого в определенном прокси API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets, достигнуто значение счетчика
MaxFailure. - Проверка работоспособности не пройдена. Ошибка:
Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?Сообщение об ошибке и URL указывают на то, что причина проблемы заключается в том, что защищенный вызов (HTTPS) был выполнен через незащищенный порт 80.
Эта ошибка может возникнуть в двух случаях:
- Защищенный целевой сервер, определенный с незащищенным портом
- Определен защищенный целевой сервер, но монитор работоспособности настроен на незащищенный порт
Защищенный целевой порт
Сценарий 1. Безопасный целевой сервер, определенный с небезопасным портом
Если вы определили защищенный целевой сервер, но с незащищенным портом, например 80, то получите эту ошибку. Чтобы проверить, так ли это, выполните следующие действия:
- Проверьте определение целевого сервера, используемого в конфигурации целевой конечной точки.
- Теперь проверьте конфигурацию монитора работоспособности для целевого сервера в конфигурации целевой конечной точки:
Настройка мониторинга состояния
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>Обратите внимание, что в конфигурации монитора состояния выше не указан элемент
<Port>. В этом случае Message Processor Edge использует порт, указанный в определении целевого сервера (который равен 80), для выполнения вызовов API проверки работоспособности. - Исходя из приведенной выше информации, причина ошибки заключается в том, что целевой сервер определен как защищенный (поскольку включен блок SSLInfo), но использует незащищенный порт 80.
Используйте Get TargetServer API, чтобы получить определение целевого сервера.
Выходные данные определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>В приведенном выше примере определение показывает, что целевой сервер
mocktargetявляется защищенным, о чем свидетельствует блок SSLInfo. Однако он настроен на небезопасный порт 80.Защищенный целевой порт для незащищенной таблицы соответствия
Сценарий 2. Определен защищенный целевой сервер, но для Health Monitor настроен незащищенный порт
Если вы определили защищенный целевой сервер, но монитор работоспособности настроен на незащищенный порт, например 80, то вы получите эту ошибку. Чтобы проверить, является ли это причиной проблемы, выполните следующие действия:
- Проверьте определение целевого сервера, используемого в конфигурации целевой конечной точки.
Используйте Get TargetServer API, чтобы получить определение целевого сервера.
Выходные данные определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>В приведенном выше примере определение показывает, что целевой сервер
mocktargetявляется защищенным, о чем свидетельствует блок SSLInfo. - Затем проверьте конфигурацию монитора работоспособности для целевого сервера в конфигурации целевой конечной точки:
Настройка мониторинга состояния
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor>В приведенном выше примере монитор состояния настроен на незащищенный порт 80, что указано в элементе
<Port>. - Исходя из приведенной выше информации, причина ошибки заключается в том, что целевой сервер определен как безопасный (поскольку включен блок SSLInfo) и использует безопасный порт 443, но монитор состояния настроен на выполнение проверок состояния с небезопасным портом 80 (указанным в элементе
<Port>).В этом случае Edge выполняет вызовы API проверки состояния как безопасные вызовы с незащищенным портом 80 и завершается с указанной выше ошибкой.
Разрешение
Защищенный целевой порт
Сценарий 1. Безопасный целевой сервер, определенный с небезопасным портом
Чтобы устранить эту ошибку, измените определение целевого сервера, указав подходящий защищенный порт.
Используйте API "Обновить целевой сервер", чтобы обновить определение целевого сервера и убедиться, что безопасный порт (например, 443) используется, как показано в примере ниже:
<TargetServer name="mocktarget">
<Host>mocktarget.apigee.net</Host>
<Port>443</Port>
<IsEnabled>true</IsEnabled>
<SSLInfo>
<Enabled>true</Enabled>
</SSLInfo>
</TargetServer>
Защищенный целевой порт, незащищенный порт HM
Сценарий 2. Определен защищенный целевой сервер, но для Health Monitor настроен незащищенный порт
Чтобы устранить эту ошибку, выполните следующие действия:
- Измените конфигурацию монитора состояния, чтобы использовать защищенный порт (например, 443) для выполнения проверок состояния целевого сервера в конфигурации целевой конечной точки неработающего прокси API, как показано ниже:
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor> - Сохраните изменения в прокси API.
Причина: небезопасный запрос на защищенном порту
диагностика;
- Определите идентификатор сообщения, для которого не удалось выполнить запрос.
- Найдите идентификатор сообщения в журнале Message Processor (
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения.
Чтобы узнать причину сбоев при проверке состояния, прокрутите страницу вверх и найдите сообщения об ошибках, связанные с мониторингом состояния.
Например, может появиться ошибка HEALTH MONITOR, как показано ниже:
Apigee-Timer-2 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) …<snipped>Если эта ошибка повторяется
MaxFailureраз (количество задано в инструменте мониторинга работоспособности), вы увидите предупреждение, например такое:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}Внимательно прочитайте предупреждение. Убедитесь, что для целевого сервера, используемого в определенном прокси API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets, достигнуто значение счетчика
MaxFailure. - Проверка работоспособности не пройдена. Ошибка:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from serverСообщение об ошибке и URL указывают на то, что причина проблемы заключается в том, что незащищенный вызов (HTTP) был выполнен через защищенный порт 443.
Эта ошибка может возникнуть в двух случаях:
- Незащищенный целевой сервер, определенный с защищенным портом
- Целевой сервер не защищен, но монитор работоспособности настроен на защищенный порт
Незащищенный целевой защищенный порт
Сценарий 1. Небезопасный целевой сервер, определенный с безопасным портом
Эта ошибка возникает, если вы определили небезопасный целевой сервер, но с безопасным портом, например 443. Чтобы проверить, так ли это, выполните следующие действия:
- Проверьте определение целевого сервера, используемого в конфигурации целевой конечной точки.
Используйте Get TargetServer API, чтобы получить определение целевого сервера.
Выходные данные определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>В приведенном выше примере определение показывает, что целевой сервер
mocktargetявляется незащищенным, поскольку отсутствует блок SSLInfo. Однако он неправильно настроен на безопасный порт 443. - Теперь проверьте конфигурацию монитора работоспособности для целевого сервера в конфигурации целевой конечной точки:
Настройка мониторинга состояния
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>Обратите внимание, что в конфигурации выше не указан элемент
<Port>. В этом случае Message Processor Edge будет использовать порт, указанный в определении целевого сервера (443). - Исходя из приведенной выше информации, причина ошибки заключается в том, что целевой сервер определен как незащищенный (поскольку блок SSLInfo не задан), но при этом используется защищенный порт 443.
То есть Edge выполняет проверку состояния как незащищенный вызов с защищенным портом 443 и завершается с указанной выше ошибкой.
Незащищенный целевой защищенный порт HM
Сценарий 2. Целевой сервер не защищен, но монитор работоспособности настроен на защищенный порт
Если вы определили незащищенный целевой сервер, но монитор работоспособности настроен на защищенный порт, например 443, то вы получите эту ошибку. Чтобы проверить, так ли это, выполните следующие действия:
- Проверьте определение целевого сервера, используемого в конфигурации целевой конечной точки.
Используйте Get TargetServer API, чтобы получить определение целевого сервера.
Выходные данные определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>В приведенном выше примере определение показывает, что целевой сервер
mocktargetявляется незащищенным (поскольку отсутствует блок SSLInfo) и настроен на незащищенный порт 80 правильно. - Затем проверьте конфигурацию монитора работоспособности для целевого сервера в конфигурации целевой конечной точки:
Настройка монитора состояния
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>В примере выше монитор работоспособности настроен на защищенный порт 443, что указано в элементе
<Port>. - Исходя из приведенной выше информации, причина ошибки заключается в том, что целевой сервер определен как незащищенный (поскольку блок SSLInfo не определен) с незащищенным портом 80, но монитор состояния настроен на выполнение проверок состояния с помощью защищенного порта 443 (указанного в элементе
<Port>).В этом случае Edge выполняет проверку состояния как незащищенный вызов с защищенным портом 443 и завершается с указанной выше ошибкой.
Разрешение
Незащищенный целевой защищенный порт
Сценарий 1. Небезопасный целевой сервер, определенный с безопасным портом
Чтобы устранить эту ошибку, измените определение целевого сервера, указав подходящий защищенный порт.
Используйте Update a Target Server API, чтобы обновить определение целевого сервера и убедиться, что используется незащищенный порт (например, 80) , как показано в примере ниже:
<TargetServer name="mocktarget">
<Host>mocktarget.apigee.net</Host>
<Port>80</Port>
<IsEnabled>true</IsEnabled>
</TargetServer>
Незащищенный целевой защищенный порт HM
Сценарий 2. Целевой сервер не защищен, но монитор работоспособности настроен на защищенный порт
Чтобы устранить эту ошибку, выполните следующие действия:
- Удалите элемент
<Port>из конфигурации монитора работоспособности или измените конфигурацию монитора работоспособности, чтобы использовать незащищенный порт (например, 80) для выполнения проверок работоспособности целевого сервера в конфигурации целевой конечной точки неработающего прокси API, как показано ниже:<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor> - Сохраните изменения в прокси API.
Причина: API проверки работоспособности возвращает ошибку
диагностика;
- Определите идентификатор сообщения, для которого не удалось выполнить запрос.
- Найдите идентификатор сообщения в журнале Message Processor (
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения.
Чтобы узнать причину сбоев проверки работоспособности, прокрутите страницу вверх и найдите распространенные сообщения об ошибках, а также ошибки и предупреждения мониторинга работоспособности.
Например, вы можете увидеть предупреждение о состоянии системы, как показано ниже.
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200 Apigee-Timer-7 WARN SERVICES.HEALTH_MONITOR - HTTPMonitor.monitor() : HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404Если эта ошибка повторяется
MaxFailureраз (количество задано в инструменте мониторинга работоспособности), вы увидите предупреждение, например такое:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}Внимательно прочитайте предупреждение. Убедитесь, что для целевого сервера, используемого в определенном прокси API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets, достигнуто значение счетчика
MaxFailure. - Проверка состояния вернула следующее предупреждение:
HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404В приведенном выше сообщении об ошибке говорится, что ожидаемый код ответа для API проверки работоспособности был 200, но фактический полученный ответ – 404. Поэтому это считается ошибкой.
- Прежде чем выяснять причину ошибки в ответе API проверки работоспособности, определите, почему Edge ожидает код ответа 200 для API проверки работоспособности. Для этого проверьте конфигурацию монитора работоспособности для целевого сервера в конфигурации целевой конечной точки:
Настройка мониторинга состояния
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/status/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>Обратите внимание, что конфигурация монитора работоспособности настроена с кодом ответа 200 в элементе
<SuccessResponse>. Это означает, что если Edge получает от API проверки работоспособности любой код ответа (например, 400, 401, 404, 500), кроме 200, это будет считаться ошибкой и счетчик ошибок будет увеличен. - Чтобы выяснить причину ошибки, следуйте инструкциям ниже.
- Посмотрите сообщение, которое предшествует предупреждению в журнале обработчика сообщений.
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200Запишите URL проверки состояния из этого сообщения.
- Вы можете напрямую вызвать этот URL из Message Processor и проверить фактический ответ.
curl -i https://mocktarget.apigee.net:443/status/200Ответ на вызов выше содержит код ошибки 404, как показано в журналах Message Processor:
< HTTP/2 404 - Это означает, что даже прямой вызов URL проверки работоспособности завершается с тем же кодом ответа 404. Это означает, что URL проверки работоспособности может быть неправильным или ресурс, к которому осуществляется доступ в рамках URL, больше недоступен.
- В примере API проверки состояния, приведенном выше, проблема возникает из-за того, что в конфигурации монитора состояния используется неправильный URL.
Правильный URL:
https://mocktarget.apigee.net:443/statuscode/200из фиктивного целевого API. - Если вы получили другой ответ с ошибкой, определите ее причину, выполнив описанные выше действия. При необходимости обратитесь к команде, которая занимается серверной частью.
Разрешение
- Устраните проблему с API проверки работоспособности на внутреннем сервере.
- Чтобы устранить проблему в приведенном выше примере:
- Измените элемент
<Path>в конфигурации монитора состояния на/statuscode/200, как показано ниже:<Path>/statuscode/200</Path> - Сохраните изменения в прокси API.
Если проблема не устранена, перейдите к разделу Сбор диагностической информации.
Как диагностировать проблемы с помощью мониторинга API
API Monitoring позволяет быстро выявлять проблемные области, чтобы диагностировать ошибки, проблемы с производительностью и задержками, а также их источник, например приложения разработчиков, прокси API, целевые серверы или платформу API.
Пошаговое описание примера, в котором показано, как устранять ошибки 5xx в API с помощью API Monitoring. Например, вы можете настроить оповещение, которое будет срабатывать, когда количество messaging.adaptors.http.flow.NoActiveTargets
ошибок превысит определенный порог.
Необходимо собрать диагностическую информацию
Если проблема не устранена, соберите следующую диагностическую информацию. Обратитесь в службу поддержки Apigee и предоставьте им следующую информацию:
- Если вы используете общедоступное облако, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Полная команда curl для воспроизведения ошибки
- Файл трассировки, содержащий запросы с ошибкой "503: сервис недоступен" и кодом ошибки NoActiveTargets
- Если вы используете частное облако, предоставьте следующую информацию:
- Полное сообщение об ошибке
- Название среды
- Пакет прокси API
- Файл трассировки, содержащий запросы с ошибкой "503: сервис недоступен" и кодом ошибки NoActiveTargets
- Журналы доступа NGINX
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log) - Журналы обработчика сообщений
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)