Данное руководство поможет настроить сервер 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