Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Видео
Дополнительные сведения об ошибках 503 см. в следующих видеороликах:
Видео | Описание |
---|---|
Устранение и устранение неполадок 503 Служба недоступна — NoActiveTargets | Узнайте о следующем:
|
Симптом
Клиентское приложение получает код состояния ответа 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.
Использование Health Monitor помогает Apigee Edge автоматически включать целевой сервер обратно в ротацию, когда он становится работоспособным, без необходимости повторного развертывания прокси-сервера API.
Вот возможные причины сбоев проверки работоспособности:
Причина | Описание | Кто может выполнять действия по устранению неполадок |
---|---|---|
Ошибка таймаута соединения | Процессору сообщений не удается подключиться к целевому серверу в течение периода ожидания, указанного в конфигурации LoadBalancer. | Пользователи 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:
Вы также можете обратиться к журналам доступа 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.NoActiveTargets , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:
Пример записи, показывающий ошибку 503
Распространенные сообщения об ошибках
Если используются целевые серверы и возникает ошибка при попытке процессора сообщений подключиться к внутреннему серверу, вы увидите несколько распространенных сообщений об ошибках в журналах процессора сообщений. Эти ошибки регистрируются после фактического сообщения об исключении/ошибке, которое привело к сбою.
Общие сообщения об ошибках, наблюдаемые в журналах процессора сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log
) для службы 503, недоступной с кодом ошибки 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>
Эти сообщения об ошибках указывают на то, что запрос не удалось отправить на внутренний сервер из-за сбоя. В результате процессор сообщений отправляет клиенту сообщение 503 Service Unavailable с кодом ошибки NoActiveTargets .
Причина: Тайм-аут соединения.
Диагностика
- Определите идентификатор сообщения неудачного запроса .
- Найдите идентификатор сообщения в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения. Однако, чтобы узнать реальную причину сбоев проверки работоспособности, прокрутите выше этих распространенных сообщений об ошибках и проверьте наличие ошибок HEALTH MONITOR.
Например, следующее сообщение об ошибке HEALTH MONITOR указывает на то, что процессор сообщений вышел из строя из-за ошибки тайм-аута соединения при выполнении запроса 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
количество раз, настроенное в Health Monitor, вы увидите такое предупреждающее сообщение: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, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets . - В приведенном выше примере проверка работоспособности завершилась неудачей из
connection timed out
. Проверьте, можете ли вы подключиться к конкретному внутреннему серверу напрямую с каждого из процессоров сообщений с помощью командыtelnet
: - Если вы можете подключиться к внутреннему серверу, вы можете увидеть сообщение типа « Подключено к внутреннему серверу» . Тогда проблема может быть временной и может быть либо решена, либо возникать периодически. Повторите шаг 4 несколько раз (более 10 раз) и проверьте результат.
- Если ошибок при выполнении команды
telnet
нет, проблема решена. Еще раз проверьте, прекратились ли сбои проверки работоспособности. Если да, то дальше ничего делать не нужно. - Если вы периодически не можете подключиться к внутреннему серверу с помощью команды
telnet
, возможно, возникла проблема с сетью или ваш внутренний сервер занят. - Если вы не можете последовательно подключиться к внутреннему серверу с помощью команды
telnet
, это может быть связано с тем, что трафик от процессоров сообщений на конкретном внутреннем сервере запрещен.
telnet <BackendServer-HostName> 443
Разрешение
Если ошибка connection timed out
постоянно наблюдается, убедитесь, что на внутреннем сервере нет каких-либо ограничений брандмауэра и разрешается трафик от процессоров сообщений Apigee Edge. Например, в Linux вы можете использовать iptables , чтобы разрешить трафик с IP-адресов процессора сообщений на внутреннем сервере.
Если проблема не устранена, обратитесь к своему сетевому администратору, чтобы определить и устранить проблему. Если вам нужна дополнительная помощь от Apigee, обратитесь в службу поддержки Apigee .
Причина: Безопасный запрос на незащищенном порту.
Диагностика
- Определите идентификатор сообщения неудачного запроса .
- Найдите идентификатор сообщения в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения. Однако, чтобы узнать реальную причину сбоев проверки работоспособности, прокрутите выше этих распространенных сообщений об ошибках и проверьте наличие ошибок HEALTH MONITOR.
Например, вы можете увидеть ошибку 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}
Внимательно прочтите информацию, указанную в предупреждающем сообщении. Убедитесь, что достигнуто число
MaxFailure
для целевого сервера, используемого в конкретном прокси-сервере API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets . - Проверка работоспособности завершилась с ошибкой:
Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Сообщение об ошибке и URL-адрес указывают, что причина этой проблемы заключается в том, что безопасный вызов (HTTPS) был выполнен через незащищенный порт 80 .
Эта ошибка может возникнуть в следующих двух сценариях:
- Безопасный целевой сервер, определенный с незащищенным портом
- Защищенный целевой сервер определен, но Health Monitor настроен с использованием незащищенного порта.
Безопасный целевой незащищенный порт
Сценарий 1: Безопасный целевой сервер, определенный с незащищенным портом
Если вы определили безопасный целевой сервер, но с незащищенным портом, например 80, вы получите эту ошибку. Выполните следующие действия, чтобы проверить, является ли это причиной данной проблемы:
- Проверьте определение целевого сервера, используемое в конфигурации целевой конечной точки.
- Теперь проверьте конфигурацию Health Monitor для целевого сервера в конфигурации целевой конечной точки:
Конфигурация монитора работоспособности
<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>
Обратите внимание, что в приведенной выше конфигурации Health Monitor не указан элемент
<Port>
. В этом случае процессор сообщений Edge использует порт, указанный в определении целевого сервера (80), для выполнения вызовов API проверки работоспособности. - На основании приведенной выше информации причина этой ошибки заключается в том, что целевой сервер определен как безопасный сервер (поскольку включен блок SSLInfo ), но с незащищенным портом 80.
Используйте API Get TargetServer, чтобы получить определение целевого сервера.
Вывод определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
В приведенном выше примере определение показывает, что
mocktarget
целевого сервера является безопасным сервером, как указано в блоке SSLInfo . Однако он настроен на незащищенный порт 80.Безопасный целевой незащищенный порт HM
Сценарий 2. Определен безопасный целевой сервер, но Health Monitor настроен с незащищенным портом.
Если вы определили безопасный целевой сервер, но Health Monitor настроен на незащищенный порт, например 80, вы получите эту ошибку. Выполните следующие действия, чтобы проверить, является ли это причиной данной проблемы:
- Проверьте определение целевого сервера, используемое в конфигурации целевой конечной точки.
Используйте API Get TargetServer, чтобы получить определение целевого сервера.
Вывод определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
В приведенном выше примере определение показывает, что
mocktarget
целевого сервера является безопасным сервером, как указано в блоке SSLInfo . - Затем проверьте конфигурацию Health Monitor для целевого сервера в конфигурации целевой конечной точки:
Конфигурация монитора работоспособности
<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>
В приведенном выше примере Health Monitor настроен на незащищенный порт 80, как указано элементом
<Port>
. - На основании приведенной выше информации причина этой ошибки заключается в том, что целевой сервер определен как безопасный сервер (поскольку включен блок SSLInfo ) и использует безопасный порт 443, но монитор работоспособности настроен на выполнение проверок работоспособности с помощью незащищенного порта. порт 80 (указан в элементе
<Port>
).То есть в этом случае Edge выполняет API-интерфейсы проверки работоспособности как безопасный вызов с незащищенным портом 80 и завершается с ошибкой с вышеупомянутой ошибкой.
Разрешение
Безопасный целевой незащищенный порт
Сценарий 1: Безопасный целевой сервер, определенный с незащищенным портом
Чтобы исправить эту ошибку, обновите определение целевого сервера, чтобы использовать соответствующий безопасный порт.
Используйте API-интерфейс обновления TargetServer , чтобы обновить определение целевого сервера и убедиться, что используется безопасный порт (например: 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 настроен с незащищенным портом.
Чтобы исправить эту ошибку, следуйте инструкциям ниже:
- Измените конфигурацию 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.
Причина: незащищенный запрос на защищенный порт.
Диагностика
- Определите идентификатор сообщения неудачного запроса .
- Найдите идентификатор сообщения в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения. Однако, чтобы узнать реальную причину сбоев проверки работоспособности, прокрутите выше этих распространенных сообщений об ошибках и проверьте наличие ошибок HEALTH MONITOR.
Например, вы можете увидеть ошибку 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}
Внимательно прочтите информацию, указанную в предупреждающем сообщении. Убедитесь, что достигнуто число
MaxFailure
для целевого сервера, используемого в конкретном прокси-сервере API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets . - Проверка работоспособности завершилась с ошибкой:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server
Сообщение об ошибке и URL-адрес указывают, что причина этой проблемы заключается в том, что через защищенный порт 443 был выполнен незащищенный вызов (HTTP).
Эта ошибка может возникнуть в следующих двух сценариях:
- Незащищенный целевой сервер, определенный с безопасным портом
- Определен незащищенный целевой сервер, но Health Monitor настроен с безопасным портом
Незащищенный целевой безопасный порт
Сценарий 1. Незащищенный целевой сервер, определенный с безопасным портом.
Если вы определили незащищенный целевой сервер, но с безопасным портом, например 443, вы получите эту ошибку. Выполните следующие действия, чтобы проверить, является ли это причиной данной проблемы:
- Проверьте определение целевого сервера, используемое в конфигурации целевой конечной точки.
Используйте API Get TargetServer, чтобы получить определение целевого сервера.
Вывод определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>
В приведенном выше примере определение показывает, что
mocktarget
целевого сервера является незащищенным сервером, поскольку в нем нет блока SSLInfo . Однако для него неправильно настроен безопасный порт 443. - Теперь проверьте конфигурацию Health Monitor для целевого сервера в конфигурации целевой конечной точки:
Конфигурация монитора работоспособности
<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>
Обратите внимание, что в приведенной выше конфигурации Health Monitor не указан элемент
<Port>
. В этом случае процессор сообщений Edge будет использовать порт, указанный в определении целевого сервера, который равен 443. - На основании приведенной выше информации причина этой ошибки заключается в том, что целевой сервер определен как незащищенный сервер (поскольку блок SSLInfo не определен), но с безопасным портом 443.
То есть Edge выполняет проверки работоспособности как незащищенный вызов с защищенным портом 443 и завершается с ошибкой с вышеупомянутой ошибкой.
Незащищенный целевой безопасный порт HM
Сценарий 2: определен незащищенный целевой сервер, но Health Monitor настроен с безопасным портом.
Если вы определили незащищенный целевой сервер, но Health Monitor настроен на безопасный порт, например 443, вы получите эту ошибку. Выполните следующие действия, чтобы проверить, является ли это причиной данной проблемы:
- Проверьте определение целевого сервера, используемое в конфигурации целевой конечной точки.
Используйте API Get TargetServer, чтобы получить определение целевого сервера.
Вывод определения целевого сервера
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
В приведенном выше примере определение показывает, что
mocktarget
целевого сервера — это незащищенный сервер (так как нет блока SSLInfo ), правильно настроенный с незащищенным портом 80. - Затем проверьте конфигурацию Health Monitor для целевого сервера в конфигурации целевой конечной точки:
Конфигурация монитора работоспособности
<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>
В приведенном выше примере Health Monitor настроен на безопасный порт 443, как указано элементом
<Port>
. - На основании приведенной выше информации причина этой ошибки заключается в том, что целевой сервер правильно определен как незащищенный сервер (поскольку блок SSLInfo не определен) с незащищенным портом 80, но монитор работоспособности настроен на выполнение проверок работоспособности. с защищенным портом 443 (указанным в элементе
<Port>
).То есть в этом случае Edge выполняет проверки работоспособности как незащищенный вызов с защищенным портом 443 и завершается с ошибкой с вышеупомянутой ошибкой.
Разрешение
Незащищенный целевой безопасный порт
Сценарий 1: незащищенный целевой сервер, определенный с безопасным портом.
Чтобы исправить эту ошибку, обновите определение целевого сервера, чтобы использовать соответствующий безопасный порт.
Используйте API обновления целевого сервера , чтобы обновить определение целевого сервера и убедиться, что используется незащищенный порт (например: 80). как показано в примере ниже:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
Незащищенный целевой безопасный порт HM
Сценарий 2: определен незащищенный целевой сервер, но Health Monitor настроен с безопасным портом.
Чтобы исправить эту ошибку, следуйте инструкциям ниже:
- Либо удалите элемент
<Port>
из конфигурации Health Monitor, либо измените конфигурацию Health Monitor, чтобы использовать незащищенный порт (например: 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 проверки работоспособности отвечает с ошибкой.
Диагностика
- Определите идентификатор сообщения неудачного запроса .
- Найдите идентификатор сообщения в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Вы увидите распространенные сообщения об ошибках, соответствующие идентификатору сообщения. Однако, чтобы узнать фактическую причину сбоев проверки работоспособности, прокрутите выше этих распространенных сообщений об ошибках и проверьте наличие ошибок/предупреждений HEALTH MONITOR.
Например, вы можете увидеть предупреждение HEALTH MONITOR, как показано ниже:
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
количество раз, настроенное в Health Monitor, вы увидите такое предупреждающее сообщение: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}
Внимательно прочтите информацию, указанную в предупреждающем сообщении. Убедитесь, что достигнуто число
MaxFailure
для целевого сервера, используемого в конкретном прокси-сервере API, для которого вы получаете код ответа 503 с кодом ошибки NoActiveTargets . - Проверка работоспособности вернула предупреждающее сообщение:
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 проверки работоспособности. Для этого проверьте конфигурацию Health Monitor для целевого сервера в конфигурации целевой конечной точки:
Конфигурация монитора работоспособности
<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>
Обратите внимание, что конфигурация Health Monitor настроена с кодом ответа 200 в элементе
<SuccessResponse>
. Это означает, что если Edge получит какой-либо код ответа (например, 400, 401, 404, 500), отличный от 200, от API проверки работоспособности, это будет расценено как ошибка и увеличит количество ошибок. - Теперь, чтобы выяснить причину ошибки ответа API проверки работоспособности, выполните следующие действия:
- Посмотрите сообщение перед предупреждающим сообщением в журнале процессора сообщений.
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
Запишите URL-адрес проверки работоспособности из этого сообщения.
- Вы можете напрямую позвонить по этому URL-адресу из процессора сообщений и проверить фактический ответ.
curl -i https://mocktarget.apigee.net:443/status/200
Ответ на вызов выше дает 404, как видно из журналов процессора сообщений:
< HTTP/2 404
- Это показывает, что даже прямой вызов URL-адреса проверки работоспособности завершается с ошибкой с тем же кодом ответа 404. Это означает, что URL-адрес проверки работоспособности может быть неправильным или ресурс, к которому осуществляется доступ как часть URL-адреса, больше не доступен.
- В приведенном выше примере API проверки работоспособности проблема возникает из-за того, что в конфигурации Health Monitor использовался неправильный URL-адрес. Правильный URL-адрес оказался
https://mocktarget.apigee.net:443/statuscode/200
из Mock Target API . - Если вы получили какой-либо другой ответ об ошибке, определите ее причину, выполнив действия, описанные выше. При необходимости поработайте со своей серверной командой.
Разрешение
- Устраните проблему с API проверки работоспособности на вашем внутреннем сервере.
- Чтобы устранить проблему в примере, рассмотренном выше:
- Измените элемент
<Path>
в конфигурации Health Monitor на/statuscode/200
как показано ниже:<Path>/statuscode/200</Path>
- Сохраните изменения в API-прокси.
Если проблема не устранена, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Диагностика проблем с помощью мониторинга API
Мониторинг API позволяет быстро изолировать проблемные области для диагностики ошибок, проблем с производительностью и задержкой, а также их источников, таких как приложения для разработчиков, прокси-серверы API, целевые серверные части или платформа API.
Ознакомьтесь с примером сценария , который демонстрирует, как устранять проблемы 5xx с вашими API с помощью мониторинга API. Например, вы можете настроить оповещение, которое будет уведомляться, когда количество ошибок messaging.adaptors.http.flow.NoActiveTargets
превышает определенный порог.
Необходимо собрать диагностическую информацию
Если проблема не устранена даже после выполнения приведенных выше инструкций, соберите следующую диагностическую информацию. Свяжитесь с нами и поделитесь ими со службой поддержки Apigee :
- Если вы являетесь пользователем Public Cloud, предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя прокси API
- Завершите команду Curl, чтобы воспроизвести ошибку.
- Файл трассировки, содержащий запросы с кодом 503 Service Unavailable и кодом ошибки NoActiveTargets.
- Если вы являетесь пользователем частного облака, предоставьте следующую информацию:
- Обнаружено полное сообщение об ошибке
- Имя среды
- Пакет API-прокси
- Файл трассировки, содержащий запросы с кодом 503 Service Unavailable и кодом ошибки NoActiveTargets.
- Журналы доступа NGINX
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log
var/log/edge-router/nginx/<org>~<env>.<port#>_access_log) - Журналы процессора сообщений
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)