Настройка среды производства Node.js при помощи PM2 на сервере Ubuntu

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

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

Примечание: Предполагается, что читатель имеет базовые знания Linux.

Создание пользователя

Часто аккаунт root используется для постоянной работы из-за расширенных привилегий. Однако такой подход небезопасен, а ошибка может повлечь за собой массу неприятных последствий. Например, взломав root, злоумышленник может получить полный контроль над сервером.

Для постоянной работы рекомендуется создать другого пользователя. В данном руководстве такой пользователь будет условно называться safeuser (так как он безопаснее, чем root); выберите любое другое удобное имя.

Войдите на сервер как root и создайте нового пользователя с каталогом /home/safeuser/:

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

Выберите пароль дл этого пользователя.

passwd safeuser

Откройте пользователю доступ к sudo:

usermod -aG sudo <username>

После этого закройте сессию root и откройте сессию нового пользователя.

Установка Git

Теперь нужно установить Git (эта программа понадобится для установки Node.js).

Примечание: Если вы не знакомы с Git, прочтите следующие руководства:

Чтобы начать установку, введите:

sudo apt-get install git

Установка Node.js

Примечание: Номер версии Node.js может отличаться.

Введите следующие команды, чтобы загрузить, скомпилировать и установить 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

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

node -v

Команда должна вернуть примерно следующее:

v0.10.24.

Настройка порта 80

Итак, приложение не должно быть запущено с помощью root. Однако текущий пользователь не имеет права использовать нужный порт – стандартный HTTP-порт 80.

Кроме того, посетители должны иметь возможность получить доступ к сайту по простому адресу (например, 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 при помощи не-root пользователя.

Установка PM2 при помощи NPM

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

PM2 – это удобный менеджер процессов Node.js, который выполняет следующие задачи:

  • Перезагружает сайт в случае сбоя (также можно использовать Forever.js).
  • Перезапускает приложение при загрузке сервера.

Чтобы начать установку PM2, введите в командную строку:

sudo npm install pm2 -g

Создание приложения Node.js

Чтобы протестировать среду производства, создайте простое приложение Node.js.

Примечание: В данном руководстве будет использоваться IP-адрес, однако рекомендуется использовать вместо него доменное имя.

Чтобы создать приложение, введите:

nano app.js

Добавьте при помощи текстового редактора следующий код:

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 и yes).

Базовое приложение по имени app.js готово. Теперь можно приступать к тестированию.

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

node app.js

Откройте браузер и введите IP-сервер; если всё работает корректно, на экране появится приветственная страница приложения app.js.

Остановите приложение, нажав crtl-C.

Приложение можно запустить иначе, при помощи PM2.

Запуск приложения при помощи PM2

Запуск приложения через PM2 имеет некоторые преимущества. Для этого введите команду:

pm2 start app.js

На экране появится отчёт:

App Name id mode PID status port Restarted Uptime memory err logs
app 0 cluster 22654 online 0 0s 8.035 MB /home/safeuser/.pm/app-err.log

Любое приложение, запущенное при помощи менеджера процессов PM2, будет автоматически перезапущено в случае сбоя; также оно будет работать как сервис. Кроме того, PM2 ведёт лог необработанных исключений (в данном случае /home/safeuser/.pm/app-err.log).

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

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. Также оно будет автоматически перезапущено в случае сбоя и во время загрузки сервера. Это очень надёжная среда для запуска приложения в производство.

Важные примечания

В папке safeuser можно найти каталог по имени node. Он использовался во время установки, но теперь он не нужен. Его можно удалить:

rm -rf /home/safuser/node

Более подробную информацию о pm2 можно найти здесь.

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

Если приложение не появляется в списке, выведенном командой:

pm2 list

то оно не будет перезагружено вместе с сервером. Чтобы исправить это, вернитесь к разделу «Запуск приложения при помощи PM2» и убедитесь, что всё выполнено правильно.

pm2 start app.js

Tags: , ,

2 комментария

Добавить комментарий