- PVSM.RU - https://www.pvsm.ru -

Установка node.js на VPS

В этой статье я расскажу, какие проблемы прийдется решить, чтобы получить VPS [1] с реально работающим node.js сервисом. Это все элементарные вещи, но, может быть, кому-нибудь еще пригодится.

Установка node

Проблема: в репозитории может не оказаться пакета для нужной версии node. Как вариант, у вас может быть два проекта, требующих разные версии node.
Решение: на девелоперских машинах в таких случаях используют nvm. На боевом сервере его тоже можно запросто использовать, просто прийдется написать специальный скрипт для запуска своего сервера.

Доступ к 80-му порту

Проблема: приложение должно обладать правами суперпользователя для того, чтобы читать порт 80 (подробнее см CAP_NET_BIND_SERVICE, man capabilities [2]). Но запуск node с такими правами считается небезопасным.
Решения:

  • использовать проксирующий сервер типа Nginx или HAProxy [3].
  • перенаправить запросы с 80-го порта на какой-нибудь с большим номером с помощью iptables. Делается практически одной командой: iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
  • стартовать-таки с правами суперпользователя, но сразу после соединения с сокетом процесс будет программно понижать свои привилегии. Подробнее здесь [4].

Балансировка нагрузки

Проблема: node однопоточный и не может эффективно использовать многоядерные процессоры.
Решения:

  • на самом деле, все он может. См cluster API [5]
  • а еще есть node-http-proxy [6] или fugue [7].
  • можно использовать Nginx (вот написано, как: раз [8], два [9]). Или HAProxy [3].

Использовать node напрямую или через Nginx?

Вопрос много где обсуждался [10], но единого мнения нет. С одной стороны, nginx — надежное, проверенное годами решение; с другой — node сам по себе умеет все тоже самое.

Как правило, предлагается один из тех вариантов:

  • node занимается сразу всем, вплоть до раздачи статических файлов.
  • node стоит за haproxy.
  • node стоит за Nginx'ом и используется только для генерации страниц, все остальное (раздача статики, балансировка, работа https) делает Nginx

Перезапуск упавшего процесса

Проблема: как возобновить работу сервера, если он вдруг упадет?
Решения:

Обновление сервиса с помощью git

Описано здесь [18]

Автор: beardog


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/node-js/16286

Ссылки в тексте:

[1] VPS: https://www.reg.ru/?rlink=reflink-717

[2] man capabilities: http://linux.die.net/man/7/capabilities

[3] HAProxy: http://haproxy.1wt.eu/

[4] здесь: http://benno.id.au/blog/2011/08/09/safely-dropping-privileges-node-js

[5] cluster API: http://nodejs.org/docs/latest/api/cluster.html

[6] node-http-proxy: https://github.com/nodejitsu/node-http-proxy

[7] fugue: https://github.com/pgte/fugue

[8] раз: http://blog.argteam.com/coding/hardening-nodejs-production-process-supervisor/

[9] два: http://blog.argteam.com/coding/hardening-node-js-for-production-part-2-using-nginx-to-avoid-node-js-load/

[10] обсуждался: https://groups.google.com/forum/?fromgroups=#!topic/nodejs/gB8veFbcX5g

[11] обрабатывать исключения: http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

[12] Upstart: http://caolanmcmahon.com/posts/deploying_node_js_with_upstart/

[13] будете использовать: http://kevin.vanzonneveld.net/techblog/article/run_nodejs_as_a_service_on_ubuntu_karmic/

[14] forever: https://github.com/indexzero/forever

[15] monit: http://howtonode.org/deploying-node-upstart-monit

[16] supervisord: http://supervisord.org/

[17] daemontools: http://cr.yp.to/daemontools.html

[18] здесь: http://clock.co.uk/tech-blogs/deploying-nodejs-apps