Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса HTTP 502 Bad Gateway с кодом ECONNRESET в качестве ответа на вызовы API в Edge Microgateway.
Сообщение об ошибке
Клиент увидит следующий код ответа:
HTTP/1.1 502 Bad Gateway
В ответе будет следующее сообщение об ошибке:
{"message":"socket hang up","code":"ECONNRESET"}Возможные причины
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Неправильно настроенное время ожидания сообщения keep-alive | Неправильно настроенное время ожидания сообщений keep-alive между Edge Microgateway и целевым сервером. | Пользователи общедоступного и частного облака Edge |
| Целевой сервер преждевременно закрывает подключение | Целевой сервер преждевременно закрывает соединение, пока Edge Microgateway отправляет полезную нагрузку запроса. | Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
- Проверьте журналы Edge Microgateway:
/var/tmp/edgemicro-`hostname`-*.log
- Выполните поиск, чтобы узнать, возникали ли ошибки
502с кодомECONNRESETв определенный период времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой502.2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test] [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684] [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
- Если уровень ведения журнала установлен на
warnилиinfo, также будет сообщение[warn], включающее имя хоста и порт целевого сервера во втором элементе. В этом примере этоX.X.X.X:8080, и его можно использовать позже, чтобы получитьtcpdump.2021-06-23T03:52:24.109Z [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup] [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware] [targetRequest error][GET][][socket hang up][ECONNRESET][395]
- Код ошибки
[socket hang up][ECONNRESET]указывает, что целевой сервер закрыл подключение к Edge Microgateway. По этому значению можно искать в журналах, чтобы определить, как часто возникает проблема.
Причина: неправильно настроенный тайм-аут keep-alive
диагностика;
- Выполните общие действия по диагностике и проверьте, появляется ли ошибка
[socket hang up][ECONNRESET]. Если да, то изучите проблему подробнее с помощью
tcpdump, как описано ниже.
Использование tcpdump
- Захватите
tcpdumpмежду Edge Microgateway и внутренним сервером в ОС хоста Edge Microgateway с помощью следующей команды:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Проанализируйте данные в столбце
tcpdump:Пример выходных данных tcpdump: ( посмотреть увеличенное изображение)
В примере выше
tcpdump:- В пакете 250288 клиент отправляет запрос
POST. - В пакете 250371 сервер отвечает
200 OK. - В пакете 250559 клиент отправляет
ACK. - В пакете 250560 сервер отправляет сообщение
Continuation. - В пакете 250561 клиент отправляет
ACK. - В пакете 262436 сервер отправляет клиенту
FIN, ACK, инициируя закрытие соединения. Обратите внимание, что это примерно пять секунд после предыдущего пакета (250561). - В пакете 262441 клиент отправляет ещё один запрос
POST. Однако это не удается, поскольку сервер уже инициировал закрытие соединения. В ответ на него в пакете 262441 возвращаетсяRST.
В этом примере одно и то же подключение было успешно использовано хотя бы один раз, но в последнем запросе сервер инициирует закрытие подключения после пяти секунд бездействия, что происходит одновременно с отправкой клиентом нового запроса. Это означает, что время ожидания сообщения keep-alive на бэкенд-сервере, скорее всего, меньше или равно значению, заданному в клиенте. Чтобы проверить это, ознакомьтесь с разделом Сравнение времени ожидания сообщения keep-alive на сервере Edge Microgateway и внутреннем сервере.
- В пакете 250288 клиент отправляет запрос
Сравнение тайм-аутов keep-alive
- У Edge Microgateway нет специального свойства для времени ожидания keep-alive. Она определяется операционной системой, в которой выполняется приложение. Примеры: Windows, Linux и контейнеры Docker.
- Возможно, это можно настроить в операционной системе. Обратитесь к системному администратору. По умолчанию в операционных системах Linux используется двухчасовой тайм-аут keep-alive.
- Затем проверьте свойство keep-alive timeout, настроенное на внутреннем сервере. Предположим, что на вашем внутреннем сервере задано значение 10 секунд.
- Если вы определите, что значение времени ожидания сообщения keep-alive в операционной системе выше, чем значение свойства времени ожидания сообщения keep-alive на бэкенд-сервере, как в примере выше, то это и будет причиной ошибок
502.
Разрешение
Убедитесь, что значение свойства keep-alive timeout в операционной системе, где работает Edge Microgateway, всегда меньше, чем на внутреннем сервере.
- Определите значение времени ожидания для сообщения keep-alive на внутреннем сервере.
- Настройте подходящее значение для свойства keep-alive timeout в операционной системе, чтобы оно было меньше значения, заданного на серверной части. Для этого выполните действия, применимые к вашей операционной системе.
Рекомендации
Настоятельно рекомендуется, чтобы у компонентов, расположенных ниже по потоку, всегда был меньший порог времени ожидания сообщений keep-alive, чем у серверов, расположенных выше по потоку. Это позволит избежать подобных состояний гонки и ошибок 502. Каждый переход к следующему узлу должен быть ниже предыдущего. В Edge Microgateway рекомендуется следовать приведенным ниже рекомендациям.
Время ожидания сообщения keep-alive в клиентском приложении или балансировщике нагрузки должно быть меньше, чем время ожидания сообщения keep-alive в Edge Microgateway.
Чтобы настроить время ожидания сообщения keep-alive в Edge Microgateway, добавьте значение
keep_alive_timeoutв файл~/.edgemicro/org-env-config.yaml.edgemicro: keep_alive_timeout: 65000
- Время ожидания сообщения keep-alive операционной системы Edge Microgateway должно быть меньше, чем время ожидания сообщения keep-alive целевого сервера.
- Если перед или после Edge Microgateway есть другие переходы, следует применить то же правило. Закрывать соединение с вышестоящим сервером должен всегда нижестоящий клиент.
Причина: целевой сервер преждевременно закрывает подключение
диагностика;
- Выполните действия, описанные в разделе Распространенные способы диагностики, и проверьте, появляется ли ошибка
[socket hang up][ECONNRESET]. - Если да, то проведите дальнейшее исследование с помощью
tcpdump, как описано ниже.Сообщение об ошибке
[targetRequest error][GET][][socket hang up][ECONNRESET]в приведенном выше примере указывает на то, что ошибка произошла, когда Edge Microgateway отправлял запрос на сервер бэкэнда (целевой сервер). То есть Edge Microgateway отправил запрос к API на бэкенд-сервер и ожидал ответа. Однако серверная часть резко прервала подключение до того, как Edge Microgateway получил ответ. - Проверьте журналы внутреннего сервера и посмотрите, нет ли в них ошибок или информации, которая могла привести к внезапному разрыву соединения. Если вы обнаружите ошибки или какую-то информацию, перейдите к разделу Решение и устраните проблему на своем внутреннем сервере.
- Если на внутреннем сервере нет ошибок или информации, соберите выходные данные команды
tcpdumpна сервере Edge Microgateway:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Проанализируйте данные в столбце
tcpdump:Пример выходных данных tcpdump: ( посмотреть увеличенное изображение)
В примере выше
tcpdump:- В пакете 4 Edge Microgateway отправил запрос
GETна целевой сервер. - В пакете 5 целевой сервер ответил
ACK, чтобы подтвердить запрос. - Однако в пакете 6 вместо полезной нагрузки ответа целевой сервер отправляет
FIN, ACK, инициируя закрытие соединения. - В пакетах 7 и далее подключение закрывается взаимно. Поскольку подключение было закрыто до отправки ответа, Edge Microgateway вернет клиенту ошибку HTTP
502. - Обратите внимание, что временная метка пакета 8,
2021-06-23T03:52:24.110Zсоответствует временной метке, в которой ошибка была зарегистрирована в журналах Edge Microgateway. Временные метки в файлах журналов и вtcpdumpчасто можно использовать, чтобы сопоставить ошибки с фактическими пакетами.
Разрешение
Устраните проблему на внутреннем сервере.
Если проблема не устранена и вам нужна помощь в устранении неполадок
502 Bad Gateway Errorили вы подозреваете, что проблема связана с Edge Microgateway, перейдите к разделу Сбор диагностической информации.Необходимо собрать диагностическую информацию
Если проблема не исчезнет после выполнения приведенных выше инструкций, соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.
- Файлы журналов. Папка по умолчанию –
/var/tmp, но ее можно переопределить в основном файлеconfig.yaml(logging > dir parameter). Рекомендуется изменитьlog > levelнаinfo, прежде чем предоставлять файлы журналов службе поддержки Apigee. - Файл конфигурации. Основная конфигурация Edge Microgateway находится в файле YAML в папке Edge Microgateway по умолчанию,
$HOME/.edgemicro. По умолчанию используется файл конфигурацииdefault.yaml, а для каждой среды – файлORG-ENV-config.yaml. Загрузите этот файл целиком для затронутой организации и среды.
- В пакете 4 Edge Microgateway отправил запрос