Как развернуть Node.JS без прерывания обслуживания?
Есть несколько постов в блоге и вопросы, написанные по этому поводу, но они в основном относятся к 2010 или 2011 году, и я надеялся получить более актуальный (эра 2014 года) ответ.
У меня есть довольно стандартное приложение Node.JS под управлением Express, Socket.IO, Passenger и т. Д. Мой рабочий сервер работает под управлением Ubuntu Server 12.04 LTS. На высоком уровне мой рабочий процесс развертывания примерно:
- Переместить / вытащить мой обновленный код на рабочий сервер с помощью git
- При необходимости запустите любые сценарии сборки и / или установите новые зависимости
- Перезапустите приложение, используя
forever restart
Приложение Node.JS работает на порте 8080, и я настроил iptables для перенаправления трафика с порта 80 на приложение Node.
Есть некоторые проблемы с этой настройкой. Наиболее значимым является перерыв в обслуживании. Поскольку мое приложение использует WebSockets, всякий раз, когда сервер перезапускается навсегда, все подключенные пользователи теряют свой сеанс WebSockets. Socket.IO автоматически переподключает пользователей, но информация о сеансе пользователя не переносится на новый экземпляр сервера. Другая проблема связана с обработкой ошибок. Если сервер Node.JS обнаруживает незапланированное исключение (что является печальной реальностью), он навсегда убивает и перезапускает сервер, снова вызывая потерю всех пользователей в своем сеансе WebSockets.
Серверы, развернутые с использованием более традиционных технологий, таких как PHP и Apache, не имеют этой проблемы, потому что (если я правильно понимаю) каждое соединение выполняется в своем собственном потоке, поэтому новое развертывание не влияет на активных в данный момент пользователей и исключение в PHP нарушает работу только одного пользователя, а не убивает сервер для всех.
Итак, как развернуть Node.JS без прерывания обслуживания, чтобы он мог сохранить сеанс для каждого пользователя?