Развертывание сервера Node.js
Я написал приложение Node.js, я ищу, чтобы запустить его на одной из наших производственных машин. Это похоже на довольно распространенный запрос, но я не могу найти адекватное решение. Не установлены ли решения для развертывания приложений Node.js?
Приложение прост (< 100 LOC), но оно должно быть очень эффективным, надежным и может работать непрерывно в течение многих лет без перезапуска. Он будет запущен на большом сайте с десятками соединений в секунду. (приложение не используется как веб-сервер, оно имеет только JSON API)
Вот те подходы, которые я рассмотрел, но я до сих пор не уверен:
Использование фреймворка (например, Express)
Поскольку приложение должно быть высокой производительности и так просто, добавление раздувания в виде рамки - это то, чего я хочу избежать.
Запуск сервера с помощью nohup
Основная проблема здесь заключается в обработке исключений, мы (очевидно) не хотим, чтобы весь сервер разбился из-за исключения. Насколько я понимаю, обертка всего приложения в цикле try {} catch {}
не поможет, потому что интерпретатор Javascript остается в непредсказуемом состоянии после исключения. Это правильно?
Использование чего-то вроде Forever
Я установил Forever на машине FreeBSD, и это было очень плохо. Это привело к появлению бесконечных процессов, которые нельзя было убить с Forever. Мне пришлось запустить kill -9
, чтобы вернуть мою машину, и я не слишком уверен в запуске производственного приложения Forever. Также кажется, что Upstart (аналогичный инструмент, но более общий) не будет работать на FreeBSD.
Хостинг решений (например, Heroku, Rackspace, Amazon EC2 и т.д.)
Это, наверное, самое простое решение, но у нас уже есть серьезное оборудование для остальных наших веб-серверов. Для финансовых соображений это не имеет смысла.
Неужели должно быть какое-то определенное решение? Я что-то пропустил?
Ответы
Ответ 1
- Вы действительно должны использовать фреймворк (я рекомендую что-то вроде Express, так как оно было проверено на бой), если вы не хотите заниматься сеансами, куки, промежуточным программным обеспечением и т.д. самостоятельно. Экспресс действительно легкий.
- Запуск сервера с nohup: вы не должны этого делать, просто запустите его с помощью обычной команды "node". Кроме того, Express переносит маршруты в try-catch, поэтому ваш сервер не будет разбиваться по маршруту. Однако, если у вашего сервера есть серьезная проблема, вы не должны бояться перезапускать его (кроме того, если у вас есть хотя бы 2-3 процесса, по крайней мере, только один умрет, поэтому будет по крайней мере 1-2 оставшихся, и пользователь выиграет ' я чувствую что-то).
- Для мониторинга я лично предпочитаю что-то большее на OS-уровне, например Upstart и Monit.
- Решение для хостинга: поскольку у вас уже есть собственные серьезные аппаратные средства, не нужно вкладывать деньги в что-то другое. Просто используйте балансировку нагрузки (возможно, nginx или node -http-proxy) для прокси-сервера.
Ответ 2
См. Хостинг Node Приложения.
В этом учебном руководстве вы можете настроить сервер, на котором могут размещаться приложения node.js для приложений на стороне сервера. Прямо сейчас, параметры хостинга node.js сводятся к запуску процессов демона Node, которые общаются с веб-сервером. Большинство веб-серверов могут прокси-соединения с другим портом, поэтому вы можете использовать Apache или nginx для этого.
Ответ 3
Здесь, наверное, три вопроса.
Вопрос 0: "Должен ли я использовать фреймворк для моего приложения node?"
Вопрос 1: "Как запустить серверы node на производственных машинах?"
Вопрос 2: "Как развернуть приложения node для производства".
Для Вопрос 1 мне очень нравится Cluster (хотя последняя версия node имеет что-то вроде который встроен, чтобы вы могли проверить это). У меня был хороший успех с чем-то вроде Monit/Upstart, чтобы следить за событиями на уровне ОС и следить за тем, чтобы ваши серверы находились в хорошем состоянии. (Это контролировало N кластеров серверов Ruby Thin, но то же самое).
В зависимости от трафика вы можете захотеть запустить кластер на нескольких машинах, а затем поставить перед ним балансировку нагрузки. Это зависит от вашего трафика, от того, сколько времени потребуется на выполнение/сколько времени вы блокируете цикл событий, и сколько экземпляров процессоров / node вы запускаете на машину.
Структура дает вам лучшую обработку ошибок и улавливает ошибки, которые могли бы выходить из обычных приложений node.js. Если вы делаете это без рамки, убедитесь, что вы прочитали об обработке ошибок в node.js.
Для Вопрос 2, я не думаю, что сообщество node имеет хороший стандарт развертывания. Вы можете попробовать использовать инструмент Ruby Capistrano (и здесь запись в блоге о развертывании кластера с Capinstrano).
Плохая вещь о Capistrano заключается в том, что он делает некоторые предположения, которые могут быть неверными (т.е. что вы развертываете проект Rails), поэтому вы можете в конечном итоге сражаться с каркасом.
Мое решение для развертывания в целом - это инструмент Python Fabric, который дает вам инструменты развертывания и позволяет делать то, что вам нужно делать.
Другой вариант развертывания - это "облако" с такими вещами, как Nodester: пусть они позаботятся об этом.
Ответ 4
Попробуйте использовать pm2, это простой и интуитивно понятный CLI, устанавливаемый через NPM. Просто запустите приложение с PM2, и ваше приложение будет готово обрабатывать тонну трафика.
Официальная ссылка PM2
Как настроить приложение node js для создания с использованием pm2
Ответ 5
Вы можете получить более качественные ответы на ServerFault, но здесь описано один пользовательский опыт здесь, используя supervisord
. Вам нужно будет использовать какой-то наблюдатель процессов, чтобы поддерживать процесс node
, и другая общая рекомендация, похоже, как-то обращается к прокси-соединениям с процессом node
. Вероятно, я проголосовал бы за nginx
(таким образом, вы можете иметь nginx
обрабатывать протоколирование, аутентификацию или любые другие функции HTTP более высокого уровня, которые вам нужны, а не как-то выпекать их в node), но вышеупомянутая статья упоминает haproxy
в комментариях здесь и там, которые могут быть более легкими. Ваш выбор обратного прокси-сервера, вероятно, будет во многом зависеть от того, нужна ли вам поддержка WebSocket.
Я не уверен, что для node еще не существует "стандартного" рабочего процесса; он не совсем зрелый, как что-то вроде Rails, у которого есть множество способов сохранить работу webapp.
Ответ 6
Ребята из Cloudkick написали отличное решение для этого. Он назывался Cast
, http://cast-project.org/.
Установите листинг на свой сервер и на свою рабочую станцию. Вы запускаете агент-агент на сервере и подписываете свою рабочую станцию с экземпляром экземпляра серверов. Затем вы можете создавать "пакеты", загружать их на сервер, создавать/обновлять/уничтожать их, а также запускать/останавливать свои экземпляры. Cast автоматически перезапустит ваши службы при их сбое. Вы также можете удаленно удалять stdout/strerr, а также получать список запущенных экземпляров и PID # s и управлять своими экземплярами/серверами с вашей рабочей станции (не требуется SSHing). Документы немного устарели, но результаты стоят немного дополнительной работы. Все взаимодействия/команды превышают HTTPS и RESTful API.
До этого я делал все обновления вручную с помощью SCP/SSH. У нас есть supervise
. Мы не оглядывались назад.