Поиск по сайту:

Как использовать PM2 для настройки производственной среды Node.js на Ubuntu VPS


Введение

Это руководство призвано помочь вам настроить сервер Ubuntu для запуска приложений Node.js, включая приложения на основе Express, Geddy или Sails. Эти инструкции помогут вам избежать некоторых ошибок безопасности, а также предоставят некоторые неожиданные преимущества, такие как:

  • Вы не будете запускать свое приложение с правами root; поэтому ваше приложение будет более безопасным.
  • Вы будете использовать порт 80 для запуска своего приложения, доступ к которому обычно может получить только пользователь root. (Вы сможете запустить свое приложение, используя собственный URL-адрес, такой как http://mysite.com, но вам не нужно будет указывать порт.)
  • Ваше приложение перезапустится в случае сбоя и будет вести журнал необработанных исключений.
  • Ваше приложение перезапустится при запуске сервера, т. е. оно будет работать как служба.

Эти инструкции предполагают, что читатель имеет только базовые знания о Linux. Вы можете пропустить информацию, которая вам не нужна, но точное выполнение шагов может дать некоторые преимущества.

Создайте безопасную учетную запись для запуска вашего кода

При первой настройке дроплета DigitalOcean вы получили инструкции по входу в систему с использованием учетной записи root. Инструкция выглядела примерно так:

Чтобы войти в свой дроплет, вам нужно будет открыть окно терминала и скопировать и вставить следующую строку:

ssh root@192.241.xxx.xxx

Обратите внимание, что «192.241.xxx.xxx» для вас будет другим. Просто следуйте инструкциям, которые вы получили от DigitalOcean при настройке вашего виртуального сервера, и войдите в систему, используя ssh.

Как понимает большинство из нас, если вы запустите свой код, используя учетную запись root, и если враждебная сторона скомпрометирует код, эта сторона может получить полный контроль над вашим VPS.

Чтобы избежать этого, давайте настроим безопасную учетную запись, которая по-прежнему может выполнять операции root, если мы укажем соответствующий пароль. Для целей этого руководства давайте назовем нашего безопасного пользователя «safeuser» — вы можете назвать его как угодно. Сейчас войдите в систему как пользователь root и выполните следующие действия:

  • Создайте пользователя с папкой в /home/safeuser/:

useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser

  • Создайте пароль для safeuser. Вам будет предложено ввести его дважды после ввода следующей команды:

passwd safeuser

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

usermod -aG sudo username

Войдите в систему как безопасный пользователь

Выйдите из корневого сеанса DigitalOcean, нажав Ctrl-D.

Обратите внимание, что команда для входа в качестве безопасного пользователя — это та же команда, которую вы использовали ранее, но имя пользователя изменилось. После того, как вы вошли в систему как безопасный пользователь, каждый раз, когда вы хотите запустить команду с привилегиями root, вам придется продолжить команду со словом sudo. Из командной строки на своем компьютере войдите в систему, используя команду, которая появляется ниже.

ssh safeuser@192.241.xxx.xxx

Установить GIT

После входа в систему установите GIT (мы собираемся использовать GIT для установки Node.js). Если по какой-либо причине вы не знакомы с GIT, это прекрасный инструмент, который станет большой частью вашей жизни. Прочтите книгу GIT, если хотите узнать больше. Установить его на Ubuntu очень просто:

sudo apt-get install git

Слово sudo указывает на то, что вы хотите запустить эту команду от имени пользователя root. Вам будет предложено ввести пароль, то есть безопасный пароль пользователя. Когда вы предоставите свой пароль, команда будет запущена.

Установите последнюю версию Node.JS

Обратите внимание, что v0.10.24 — это самая последняя версия Node на момент написания этой статьи. Если есть более новая версия, используйте этот номер версии.

Введите следующие команды, по одной строке за раз, и наблюдайте, как ваша капля загружает, компилирует и устанавливает Node.js:

sudo apt-get install build-essential
sudo apt-get install curl openssl libssl-dev
git clone https://github.com/joyent/node.git
cd node
git checkout v0.10.24
./configure
make
sudo make install

Когда вы вводите sudo make, происходит много вещей. Потерпи.

Когда процесс установки завершится, убедитесь, что все прошло успешно, набрав:

node -v

Если все прошло хорошо, вы должны увидеть: v0.10.24.

Дайте безопасному пользователю разрешение на использование порта 80

Помните, что мы НЕ хотим запускать ваши приложения от имени пользователя root, но есть одна загвоздка: у вашего безопасного пользователя нет разрешения на использование HTTP-порта по умолчанию (80). Ваша цель — иметь возможность опубликовать веб-сайт, который посетители смогут использовать, перейдя по удобному URL-адресу, такому как http://mysite.com.

К сожалению, если вы не входите в систему как root, вам обычно придется использовать URL-адрес, например http://mysite.com:3000 — обратите внимание на номер порта.

Многие люди застревают здесь, но решение простое. Есть несколько вариантов, но этот мне нравится. Введите следующие команды:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

Теперь, когда вы сообщаете приложению Node, что хотите, чтобы оно работало на порту 80, оно не будет жаловаться.

Используйте NPM для установки пакета под названием PM2.

NPM — это менеджер пакетов, который вы будете использовать для установки фреймворков и библиотек для использования с вашими приложениями Node.js. NPM был установлен с Node.js. PM2 — это приятный маленький инструмент, который решит за вас две проблемы:

  1. Он будет поддерживать ваш сайт в рабочем состоянии, перезапуская приложение в случае его сбоя. Эти сбои НЕ должны происходить, но хорошо знать, что PM2 прикроет вашу спину. (Некоторые люди могут знать о Forever.js, еще одном инструменте, который используется для поддержки работы сайтов на основе узлов — я думаю, вы обнаружите, что PM2 может многое предложить.)
  2. Это поможет вам, перезапуская ваше приложение узла как службу каждый раз, когда вы перезагружаете сервер. Некоторым пользователям известны другие способы сделать это, но pm2 делает это проще и обладает некоторой дополнительной гибкостью.

Установите PM2, введя в командной строке следующее:

sudo npm install pm2 -g

Создайте простое приложение узла

Здесь вы можете протестировать свою среду, чтобы убедиться, что все работает должным образом. В этом примере я буду использовать IP-адрес, но вашей целью должно быть использование доменного имени. Посмотрите эти инструкции позже: Как настроить имя хоста с помощью DigitalOcean

Сначала создайте простое приложение узла только для тестирования. В командной строке введите:

nano app.js

Затем введите следующие строки кода в редактор nano:

var http = require('http');
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});
server.listen(80);
console.log("Server running at http://127.0.0.1:80/");

Нажмите ctrl-X для выхода — когда nano спросит, хотите ли вы сохранить, ответьте «да».

Теперь у вас есть приложение на основе узла с именем app.js, которое вы можете использовать для тестирования своей среды.

Вы можете запустить app.js в командной строке, набрав: node app.js

Сделайте это, и вы сможете увидеть текст приветствия, используя браузер и введя свой IP-адрес в качестве URL-адреса. Вы можете прервать выполнение, нажав crtl-C. Это НЕ то, как мы хотим запускать наше приложение. Есть НАМНОГО лучший способ. Мы будем использовать PM2 для его запуска вместо прямого использования Node.

Запустите приложение с помощью PM2 и убедитесь, что приложение node.js запускается автоматически при перезапуске сервера.

Если вы запускаете приложение с помощью pm2, вы получаете огромные преимущества. Вместо запуска приложения, как указано выше, запустите его с помощью следующей команды:

Вы должны увидеть этот отчет:

Каковы преимущества запуска вашего приложения таким образом?

  • PM2 автоматически перезапустит ваше приложение, если оно выйдет из строя.
  • PM2 будет вести журнал необработанных исключений — в данном случае в файле по адресу /home/safeuser/.pm2/logs/app-err.log.
  • С помощью одной команды PM2 может гарантировать, что все приложения, которыми он управляет, перезапускаются при перезагрузке сервера. По сути, ваше приложение узла запустится как служба.

Запустите эту команду, чтобы запустить приложение как службу, введя следующее:

sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser

Обратите внимание, что вы можете не использовать safeuser в качестве имени пользователя — используйте имя, соответствующее вашей настройке. Вы должны увидеть следующий отчет:

Adding system startup for /etc/init.d/pm2-init.sh ...
   /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh

Теперь наши заявленные цели достигнуты!

  • Вы не работаете как root; поэтому ваше приложение более безопасно.
  • Вы используете порт 80, который обычно может использовать только пользователь root.
  • Ваше приложение перезапустится в случае сбоя и будет вести журнал необработанных исключений.
  • Ваше приложение перезапустится при запуске сервера.

Веселиться! Это довольно надежная установка для начала.

**После размышлений: ** Вы можете заметить папку с файлами под названием node в каталоге safeuser. Он использовался при установке, но вам он больше не нужен. Вы можете удалить его, набрав следующее:

rm -rf /home/safuser/node

О узле можно узнать гораздо больше, но это руководство направит вас на правильный путь. Чтобы узнать больше о pm2, посетите репозиторий pm2

Важное уточнение. Существует сценарий запуска, который запускает ваши приложения Node, но вы избежите путаницы, если поймете, как он работает. Скрипт называется «pm2-init.sh». Он находится в каталоге «etc/init.d/», но НЕ запускает app.js. Вместо этого он запускает программы, которые были запущены под PM2 при последнем выключении сервера.

Это важно. Если ваше приложение узла не отображается в списке, когда вы вводите список pm2, ваше приложение не будет перезапущено при перезапуске сервера. Следуйте инструкциям по запуску приложений с помощью pm2, чтобы убедиться, что они будут перезапущены: pm2 start app.js

Джим Кэссиди