В этой статье я расскажу, какие проблемы прийдется решить, чтобы получить
Установка node
Проблема: в репозитории может не оказаться пакета для нужной версии node. Как вариант, у вас может быть два проекта, требующих разные версии node.
Решение: на девелоперских машинах в таких случаях используют nvm. На боевом сервере его тоже можно запросто использовать, просто прийдется написать специальный скрипт для запуска своего сервера.
Доступ к 80-му порту
Проблема: приложение должно обладать правами суперпользователя для того, чтобы читать порт 80 (подробнее см CAP_NET_BIND_SERVICE, man capabilities). Но запуск node с такими правами считается небезопасным.
Решения:
- использовать проксирующий сервер типа Nginx или HAProxy.
- перенаправить запросы с 80-го порта на какой-нибудь с большим номером с помощью
iptables
. Делается практически одной командой:iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
- стартовать-таки с правами суперпользователя, но сразу после соединения с сокетом процесс будет программно понижать свои привилегии. Подробнее здесь.
Балансировка нагрузки
Проблема: node однопоточный и не может эффективно использовать многоядерные процессоры.
Решения:
- на самом деле, все он может. См cluster API
- а еще есть node-http-proxy или fugue.
- можно использовать Nginx (вот написано, как: раз, два). Или HAProxy.
Использовать node напрямую или через Nginx?
Вопрос много где обсуждался, но единого мнения нет. С одной стороны, nginx — надежное, проверенное годами решение; с другой — node сам по себе умеет все тоже самое.
Как правило, предлагается один из тех вариантов:
- node занимается сразу всем, вплоть до раздачи статических файлов.
- node стоит за haproxy.
- node стоит за Nginx'ом и используется только для генерации страниц, все остальное (раздача статики, балансировка, работа https) делает Nginx
Перезапуск упавшего процесса
Проблема: как возобновить работу сервера, если он вдруг упадет?
Решения:
- Если правильно обрабатывать исключения, падений практически не будет.
- Upstart (который вы, скорее всего, будете использовать для начального запуска сервиса) умеет перезапускать упавшие процессы.
- Ну и куча решений собственно для мониторинга и перезапуска: forever, monit, supervisord, daemontools.
Обновление сервиса с помощью git
Описано здесь
Автор: beardog