Подготовка приложения Node.js к производству в Ubuntu 14.04
Java, Ubuntu | Комментировать запись
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: Javascript, NGINX, Node.js, Ubuntu 14.04