Node.js имеет встроенные возможности веб-сервера, но стандартные настройки не включают хороший способ инициировать корректное завершение работы. Наш опыт размещения большого количества несвязанных сайтов позволил нам найти простое решение этой проблемы. Это исправление поможет не только нашим клиентам и другим пользователям Lagoon, но и всем, кто использует серверы Node.js в контейнерной среде.

Во время масштабирования и развертывания мы заметили ошибки, которых быть не должно. После того, как контейнер отправляет сигнал об отключении сервера Node.js, у него должно быть 30 секунд для выполнения задач и продолжения работы, но на практике этого не происходило. Хотя на стороне Docker все было правильно настроено для размещения Node.js, сервер Node.js по-прежнему немедленно отключался и уничтожал все активные соединения, что приводило к ошибкам.

Шаг первый

Довольно просто сказать нашим серверам Node.js завершить все запросы перед выключением, добавив следующий код:

Шаг второй

Но, как мы обнаружили, само по себе это не всегда решает проблему. Суть в том, что многие системы Node.js построены с помощью Yarn или NPM. Они обеспечивают управление пакетами для Node.js, а также управление сценариями, что означает, что мы можем запускать приложения, просто указав им запускаться в Dockerfiles. К сожалению, это означает, что если Yarn или NPM получают сигнал SIGNT или SIGTEM, они пересылают этот сигнал в Node.js, но не ждут завершения процессов. Для этого есть открытые проблемы с поддержкой как в Yarn, так и в NMP, но они еще не решены.

Реальное решение состоит в том, чтобы не использовать ни то, ни другое для запуска вашего приложения, а вместо этого использовать узел напрямую:

Соединив это с кодом на первом шаге, вы можете каждый раз обеспечивать корректное завершение работы. Для получения более подробной информации вы можете прочитать нашу документацию здесь или связаться с нами сегодня!