Назад | Перейти на главную страницу

Что может вызвать Nginx «сброс соединения одноранговым узлом», когда восходящий поток исправен?

В развертывании AWS Beanstalk (один сервер) сервер Nginx обращается к серверу NodeJS / Express на том же хосте. время от времени жалуется на потерю соединения с восходящим потоком.

2020/03/23 10:52:43 [error] 11443#0: *70 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.46.70, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"
2020/03/23 10:52:48 [error] 11444#0: *580 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "POST /api/app/importNutriwebData HTTP/1.1", upstream: "http://172.17.0.3:33080/api/app/importNutriwebData", host: "******"
2020/03/23 10:52:50 [error] 11443#0: *526 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.31.21.226, server: , request: "GET /health-check HTTP/1.1", upstream: "http://172.17.0.3:33080/health-check", host: "172.31.39.242"

Это происходит без какой-либо видимой причины, в том числе /health-check URL-адрес очень простой response.send("OK");. Кажется, это происходит со случайными URL-адресами.

Апстрим 172.17.0.3 находится на той же машине, на которой работает Nginx. Все нисходящие соединения поступают из CloudFront.

Та же самая установка отлично работала последние 3-4 года, но эти ошибки начинают увеличиваться с 2-3 дней. Я не могу придумать ничего, что могло бы измениться, кроме может быть На 10% больше запросов или около того. Может быть около 50 долгоживущих соединений EventStream, но никогда не может быть больше 100 одновременных соединений. Я почти уверен, что сервер NodeJS в порядке.

Я также пробовал обновить Amazon Linux, перезагрузить серверы, полностью перестроить развертывание EBS - ничего не изменилось.

Я могу бегать бесконечно curl цикл к восходящему URL-адресу (http://172.17.0.3:33080/health-check) или даже общедоступный URL-адрес CloudFront => Nginx, и я не могу воспроизвести проблему, несмотря на попытки тысячи запросов (тестов) в течение нескольких минут.

На сервере около 1,5 гигабайт оперативной памяти. свободно, CPU загружен примерно на 80% праздный.

Дескрипторы открытых файлов мне кажутся низкими:

$ for pid in $(pidof nginx) ; do sudo ls /proc/$pid/fd | wc -w ; done
130
169
11

$ for pid in $(pidof node) ; do sudo ls /proc/$pid/fd | wc -w ; done
146

Может ли быть, что у Nginx заканчиваются какие-то ресурсы? Это проблема времени? Что я могу сделать для дальнейшей отладки?

Любая помощь очень ценится.

Похоже, что ваше приложение NodeJS по какой-то причине отправляет RST-пакет в nginx. Вы могли бы попробовать tcpdump и / или strace для захвата сетевого трафика и системных вызовов примерно в то время, когда возникает ошибка; затем выясните, не происходит ли что-то странное.

Этот ресурс может быть полезен, поскольку он, кажется, описывает очень похожую проблему, связанную с время ожидания поддержки активности: http://theantway.com/2017/11/analyze-connection-reset-error-in-nginx-upstream-with-keep-alive-enabled