Подготовка приложения Node.js к производству в Ubuntu 14.04

Published by Leave your thoughts

Node.js – это платформа JavaScript для программирования общего назначения, которая позволяет быстро создавать сетевые приложения. Данная платформа работает в Linux, OS X, FreeBSD и Windows. Приложения Node.js можно запускать в командной строке, но данное руководство продемонстрирует, как запустить приложение в качестве сервиса (в таком случае приложение сможет автоматически перезагружаться вместе с сервером или при сбое и будет безопасно для использования в производственной среде).

Данное руководство поможет подготовить среду Node.js к производству на сервере Ubuntu 14.04. Приложение Node.js будет управляться PM2 и предоставит пользователям безопасный доступ при помощи обратного прокси-сервера Nginx.

Примечание: Аналогичный мануал для CentOS – по этой ссылке.

Требования

В данном руководстве используется два сервера Ubuntu 14.04. Они называются:

  • App: сервер, на котором нужно установить Node.js, приложение Node.js и PM2.
  • Web: на этом сервере будет установлен веб-сервер Nginx, обратный прокси-сервер приложения.

Руководство можно выполнить и на одном сервере, но в таком случае нужно внести несколько изменений в настройки. Просто используйте адрес localhost (127.0.0.1)вместо закрытого IP-адреса сервера app.

Также для выполнения нужны:

  • Не root пользователь с доступом к sudo.
  • Домен, направленный на внешний IP-адрес сервера.

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

Для начала нужно установить Node.js на сервер app.

Обновите индекс пакетов:

sudo apt-get update

Установите пакет git, от которого зависит npm, при помощи apt-get:

sudo apt-get install git

Откройте страницу загрузки Node.js и найдите ссылку Linux Binaries (.tar.xz). Скопируйте ссылку в буфер.

Откройте домашний каталог и загрузите Node.js:

cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

Распакуйте архив в каталог node:

mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node

Удалите ненужный архив Node.js:

cd ~
rm -rf node-v*

Теперь нужно настроить глобальный prefix для npm, который будет использоваться при создании символьных ссылок. В данном случае это /usr/local.

mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc

Теперь можно переместить бинарные файлы node и npm в каталог /opt/node:

sudo mv node /opt/

Передайте права на файл пользователю root:

sudo chown -R root: /opt/node

Создайте символьные ссылки файлов node и npm и поместите их в /usr/local/bin:

sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

Убедитесь, что установка Node прошла успешно:

node -v

Команда вернёт версию программы.

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

В качестве примера можно создать простое приложение Hello World; оно будет возвращать фразу Hello World на любой запрос HTTP. Такое приложение можно в дальнейшем использовать в качестве шаблона для более сложного приложения.

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

Чтобы приложение Node.js обслуживало запросы, поступающие с прокси-сервера (web), используйте интерфейс частной сети сервера app. Чтобы узнать IP-адрес сервера app, введите:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

Скопируйте вывод (закрытый IP), он пригодится в дальнейших настройках.

Код приложения Hello World

Создайте приложение Node.js и откройте его в текстовом редакторе (в руководстве файл называется hello.js):

cd ~
vi hello.js

Вставьте в файл следующий код. Замените APP_PRIVATE_IP_ADDRESS внутренним IP-адресом сервера app. При необходимости можно заменить номер порта (он должен быть от 1024 и больше).

var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');

Сохраните и закройте файл.

Данное приложение будет слушать заданный адрес (localhost) и порт (8080) и возвращать фразу Hello World с HTTP-кодом 200. При прослушивании localhost удалённые клиенты не смогут получить доступ к приложению.

Тестирование приложения

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

node hello.js

Примечание: Запуская Node.js таким образом, вы блокируете дополнительные команды. Команды будут доступны после остановки приложения (Ctrl-C).

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

curl http://APP_PRIVATE_IP_ADDRESS:8080

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

Hello World

Если такой вывод не появился, убедитесь, что приложение Node.js запущено и правильно настроено (слушает правильный адрес и порт).

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

Установка PM2

Теперь нужно установить PM2. Это менеджер процессов Node.js. PM2 предоставляет простой способ управления и демонизации приложений.

Установку можно выполнить при помощи пакетного менеджера npm на сервере app:

sudo npm install pm2 -g

Управление приложением с помощью PM2

Менеджер процессов PM2 очень прост в использовании. Рассмотрим основы его работы.

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

Для запуска приложений в фоновом режиме используется команда pm2 start:

pm2 start hello.js

Также эта команда добавит приложение в список процессов PM2, который выводится на экран при запуске каждого приложения:

┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

Как видите, PM2 автоматически устанавливает App name (имя файла без расширения .js) и PM2 id. Также PM2 предоставляет другую информацию: PID процесса, текущее состояние, использование памяти.

Запущенное с помощью PM2 приложение будет автоматически перезапускаться в случае ошибок или сбоев, однако автоматический запуск приложения нужно настроить отдельно. Для этого существует подкоманда startup.

Эта команда генерирует и настраивает сценарий запуска менеджера PM2 и всех его процессов вместе с загрузкой сервера. Также нужно указать платформу (в данном случае это ubuntu).

pm2 startup ubuntu

В последней строке вывода находится команда, которую нужно запустить с привилегиями суперпользователя:

[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u 8host --hp /home/8host"

Запустите сгенерированную команду, чтобы настроить автозапуск PM2.

sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u 8host --hp /home/8host"

Другие функции PM2 (опционально)

PM2 предоставляет множество других функций, которые позволяют управлять или просматривать информацию о приложениях. Обратите внимание, что запуск PM2 без каких-либо аргументов отобразит страницу справки, на которой можно найти подробные примеры использования PM2.

Остановить приложение можно при помощи команды:

pm2 stop example

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

pm2 restart app_name_or_id

Список приложений, управляемых PM2, можно просмотреть при помощи следующей подкоманды:

pm2 list

Подробную информацию о конкретном приложении можно получить с помощью подкоманды info:

pm2 info example

Подкоманда monit показывает данные процесса PM2: состояние приложения, использование CPU и памяти:

pm2 monit

Теперь нужно настроить обратный прокси.

Nginx как обратный прокси-сервер

Итак, приложение запущено и прослушивает localhost. Теперь нужно настроить доступ к нему. Установите Nginx как обратный прокси-сервер.

Примечание: Если Nginx уже установлен, скопируйте блок location в файл виртуального хоста (убедитесь, что скопированные настройки не конфликтуют с уже существующими настройками).

Перейдите на сервер web. Обновите список пакетов и установите Nginx:

sudo apt-get update
sudo apt-get install nginx

Откройте стандартный блок server:

sudo vi /etc/nginx/sites-available/default

Удалите все содержимое файла и вставьте предложенные ниже настройки. Измените директиву server_name (укажите домен или IP) и номер порта (8080), если приложение прослушивает другой порт. Вместо APP_PRIVATE_IP_ADDRESS введите IP-адрес сервера app.

server {
listen 80;
server_name example.com;
location / {
proxy_pass http://APP_PRIVATE_IP_ADDRESS: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;
}
}

Теперь сервер web будет отвечать на запросы к root-каталогу. К примеру, если сервер доступен по домену example.com, то приложение будет доступно по ссылке:

http://example.com/

Это отправит запрос приложению hello.js на порт 8080 на внутренний IP сервера app.

В этот файл можно добавить ещё несколько блоков location, чтобы открыть доступ к другим приложениям, размещённым на сервере web. К примеру, если бы другое приложение на сервере app использовало порт 8081, блок, открывающий доступ по ссылке http://example.com/app2, имел бы такой вид:

location /app2 {
proxy_pass http://APP_PRIVATE_IP_ADDRESS: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;
}

Сохраните и закройте файл.

Перезапустите Nginx на сервере web:

sudo systemctl restart nginx

Если приложение Node.js запущено, а сервер Nginx правильно настроен, теперь вы можете получить доступ к приложению через обратный прокси-сервер Nginx.

Заключение

Теперь приложение Node.js запущено и использует Nginx в качестве обратного прокси на сервере Ubuntu 14.04.

Чтобы защитить приложение, получите бесплатный сертификат TLS/SSL от Let’s Encrypt.

Tags: , , ,

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>