В развертывании 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