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

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

    Установка 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 однопоточный и не может эффективно использовать многоядерные процессоры.
    Решения:


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


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

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


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


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


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


    Описано здесь
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 10

      –1
      Спасибо большое!
        0
        Кратко и понятно!
          +1
          Может я чего и не понимаю, но разве nginx не позиционируется как лучший сервер для раздачи статики? Не будет ли раздача статики javascript-ом медленным велосипедом? + нет необходимости занимать 80-ый порт.
            0
            Не могу сейчас найти ссылку, но я точно видел пост (или комментарий) человека, утверждавшего, что node отдает статику так же быстро, как и nginx. Не знаю, как такое получилось, возможно, у него была просто пара файлов, которые он все время держал в памяти.
              +1
              Статику нодой можно действительно отдавать быстро, даже есть нативный sendfile, но:
              — настройка nginx гибче (либо используем самописные велосипеды);
              — при 10K files 10K connections есть сомнения, что обвязка справиться;
              — тем самым вы разгружаете ноду, для работы с динимикой.
              Кстати здесь есть сравнение, правда для lighty, что не суть важно.
              0
              Спасибо.
              А то я мучался вопросом, правильно ли подобрал связку сервисов?
              Оказывается все тоже мучаются.
                0
                Насколько, по Вашему мнению, уместно пробовать это с маломощными компютерами на Linux?
                Raspberry Pi В, например… Там всего лишь 256 ОЗУ…
                  0
                  У меня на VPS с 386 ОЗУ уместились mongoDB + nodejs, apache2 + mysql + nginx + php. Памяти хватило, больше всего ест mongoDB. Правда пришлось подшаманить с ulimit -s 1024, иначе даже лампу толком развернуть не получится.
                    0
                    Пробовал на VPS с 192МБ, никаких проблем. Правда подшаманил линукс чуть-чуть, например лимиты на стек, как ув. kmike описал здесь
                    0
                    В разделе «Перезапуск упавшего процесса» стоит повторно упомянуть cluster API.

                    Only users with full accounts can post comments. Log in, please.