Подготовка приложения Node.js к производству в Debian 8
Debian, Java | Комментировать запись
Node.js – это платформа JavaScript для программирования общего назначения, которая позволяет быстро создавать сетевые приложения. Данная платформа работает в Linux, OS X, FreeBSD и Windows. Приложения Node.js можно запускать в командной строке, но данное руководство продемонстрирует, как запустить приложение в качестве сервиса (в таком случае приложение сможет автоматически перезагружаться вместе с сервером или при сбое и будет безопасно для использования в производственной среде).
Данное руководство поможет подготовить среду Node.js к производству на сервере Debian 8. Приложение Node.js будет управляться PM2 и предоставит пользователям безопасный доступ при помощи обратного прокси-сервера Nginx.
Требования
- Сервер Debian 8 (инструкции по настройке здесь).
- Не root пользователь с доступом к sudo.
- Домен, направленный на внешний IP-адрес сервера.
Установка Node.js
Для начала нужно установить LTS-релиз Node.js при помощи архива NodeSource.
Установите PPA в домашний каталог, чтобы получить доступ к его содержимому. Используйте curl, чтобы извлечь установочный сценарий необходимой версии (укажите её вместо 6.x ):
cd ~
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
Проверьте содержимое сценария при помощи редактора:
nano nodesource_setup.sh
Запустите сценарий:
sudo bash nodesource_setup.sh
Архив PPA будет добавлен в настройки. Индекс пакетов обновится автоматически. После запуска установочного сценария nodesource можно установить пакет Node.js:
sudo apt-get install nodejs
Пакет nodejs содержит бинарный файл nodejs и npm (потому вам не придётся устанавливать npm отдельно). Однако для работы некоторых компонентов npm (компилирующих исходный код и т.п.) необходим пакет build-essential:
sudo apt-get install build-essential
Теперь можно приступать к созданию приложения.
Создание приложения Node.js
В качестве примера можно создать простое приложение Hello World; оно будет возвращать фразу Hello World на любой запрос HTTP. Такое приложение можно в дальнейшем использовать в качестве шаблона для более сложного приложения.
Примечание: Копируя код, не забудьте указать свой IP-адрес и порт вместо условных данных.
Код приложения Hello World
Создайте приложение Node.js и откройте его в текстовом редакторе (в руководстве файл называется hello.js):
cd ~
nano hello.js
Вставьте в файл следующий код. При необходимости можно заменить номер порта 8080 (он должен быть от 1024 и больше).
#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');
Сохраните и закройте файл.
Данное приложение будет слушать указанный адрес (localhost) и порт (8080) и возвращать фразу Hello World с HTTP-кодом 200. При прослушивании localhost удалённые клиенты не смогут получить доступ к приложению.
Тестирование приложения
Чтобы протестировать приложение, создайте исполняемый файл hello.js:
chmod +x ./hello.js
Запустите его:
./hello.js
Server running at http://localhost:8080/
Примечание: Запуская Node.js таким образом, вы блокируете дополнительные команды. Они будут доступны после остановки приложения (Ctrl-C).
Чтобы протестировать приложение, откройте новый терминал и подключитесь к localhost с помощью curl:
curl http://localhost:8080
Если на экране появился следующий вывод, приложение работает правильно:
Hello World
Если такой вывод не появился, убедитесь, что приложение Node.js запущено и правильно настроено (слушает правильный адрес и порт).
Остановите приложение, нажав Ctrl+C.
Установка PM2
Теперь нужно установить PM2. Это менеджер процессов Node.js. PM2 предоставляет простой способ управления и демонизации приложений.
Установку можно выполнить при помощи пакетного менеджера npm.
sudo npm install -g pm2
При помощи опции –g менеджер npm выполнит глобальную установку PM2.
Управление приложением с помощью PM2
Менеджер процессов PM2 очень прост в использовании. Рассмотрим основы его работы.
Запуск приложения
Для запуска приложений в фоновом режиме используется команда pm2 start:
pm2 start hello.js
Также эта команда добавит приложение в список процессов PM2, который выводится на экран при запуске каждого приложения:
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
Как видите, PM2 автоматически устанавливает App name (имя файла без расширения .js) и PM2 id. Также PM2 предоставляет другую информацию: PID процесса, текущее состояние, использование памяти.
Запущенное с помощью PM2 приложение будет автоматически перезапускаться в случае ошибок или сбоев, однако автоматический запуск приложения нужно настроить отдельно. Для этого существует подкоманда startup.
Эта команда генерирует и настраивает сценарий запуска менеджера PM2 и всех его процессов вместе с загрузкой сервера. Также нужно указать платформу (в данном случае это ubuntu).
pm2 startup systemd
В последней строке вывода находится команда, которую нужно запустить с привилегиями суперпользователя:
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u 8host --hp /home/8host
Запустите сгенерированную команду, чтобы настроить автозапуск PM2.
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u 8host --hp /home/8host
Эта команда создаст unit-файл для systemd, запускающий pm2 при запуске сервера. Менеджер pm2, в свою очередь, запустит приложение hello.js. Проверьте состояние юнита systemd:
systemctl status pm2
Читайте также: Основы Systemd: управление сервисами и журналирование
Другие функции PM2 (опционально)
PM2 предоставляет множество других функций, которые позволяют управлять или просматривать информацию о приложениях. Обратите внимание, что запуск PM2 без каких-либо аргументов отобразит страницу справкина которой можно найти подробные примеры использования PM2.
Остановить приложение можно при помощи:
pm2 stop app_name_or_id
Чтобы перезапустить приложение, введите:
pm2 restart app_name_or_id
Список приложений, управляемых PM2, можно просмотреть при помощи следующей подкоманды:
pm2 list
Подробную информацию о конкретном приложении можно получить с помощью подкоманды info:
pm2 info example
Подкоманда monit показывает данные процесса PM2: состояние приложения, использование CPU и памяти:
pm2 monit
Теперь нужно настроить обратный прокси.
Nginx как обратный прокси-сервер
Итак, приложение запущено и прослушивает localhost. Теперь нужно настроить доступ к нему. Установите Nginx как обратный прокси-сервер.
Примечание: Если Nginx уже установлен, скопируйте блок location в файл виртуального хоста (убедитесь, что скопированные настройки не конфликтуют с уже существующими настройками).
Чтобы установить Nginx, введите:
sudo apt-get install nginx
Откройте стандартный блок server:
sudo nano /etc/nginx/sites-available/default
Удалите все содержимое файла и вставьте предложенные ниже настройки. Откорректируйте номер порта (8080), если приложение прослушивает другой порт.
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Теперь сервер будет отвечать на запросы к root-каталогу. К примеру, если сервер доступен по домену example.com, то приложение будет доступно по ссылке:
http://example.com/
Это отправит запрос приложению hello.js на порт 8080 localhost.
В этот файл можно добавить ещё несколько блоков location, чтобы открыть доступ к другим приложениям, размещённым на этом сервере. К примеру, если бы другое приложение использовало порт 8081, блок, открывающий доступ по ссылке http://example.com/app2, имел бы такой вид:
location /app2 {
proxy_pass http://localhost:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Сохраните и закройте файл.
Убедитесь, что в файлах нет ошибок:
sudo nginx -t
После этого перезапустите Nginx:
sudo systemctl restart nginx
Теперь нужно открыть порт приложения в брандмауэре.
Если вы используете ufw, введите команду:
sudo ufw allow 'Nginx Full'
Чтобы проверить состояние брандмауэра, используйте команду:
sudo ufw status
Если вы используете IPTables, вы можете разблокировать трафик Nginx с помощью команды:
sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Чтобы проверить состояние брандмауэра, введите:
sudo iptables -S
Если приложение Node.js запущено, а сервер Nginx правильно настроен, теперь вы можете получить доступ к приложению через обратный прокси-сервер Nginx. Попробуйте открыть URL сервера (его IP или домен).
После этого нужно защитить сервер при помощи шифрования трафика. Все необходимые инструкции вы найдёте в руководстве Создание сертификата Let’s Encrypt для Nginx в Debian 8.
Заключение
Теперь приложение Node.js запущено и использует Nginx в качестве обратного прокси на сервере Debian 8.
Tags: Debian 8, NGINX, Node.js, PM2