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