Поиск по сайту:

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


Введение

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

В этом руководстве мы рассмотрим настройку готовой к работе среды Node.js, состоящей из двух серверов Ubuntu 14.04; на одном сервере будут запускаться приложения Node.js, управляемые PM2, а другой предоставит пользователям доступ к приложению через обратный прокси-сервер Nginx к серверу приложений.

Версию этого руководства для CentOS можно найти здесь.

Предпосылки

В этом руководстве используются два сервера Ubuntu 14.04 с частной сетью (в одном центре обработки данных). Мы будем называть их следующими именами:

  • приложение: сервер, на котором мы установим среду выполнения Node.js, ваше приложение Node.js и PM2.
  • web: сервер, на котором мы установим веб-сервер Nginx, который будет действовать как обратный прокси-сервер для вашего приложения. Пользователи получат доступ к общедоступному IP-адресу этого сервера, чтобы получить доступ к вашему приложению Node.js.

Для этого руководства можно использовать один сервер, но вам придется внести несколько изменений по пути. Просто используйте IP-адрес локального хоста, например 127.0.0.1, везде, где используется частный IP-адрес сервера приложений.

Вот диаграмма того, какой будет ваша установка после выполнения этого руководства:

Прежде чем приступить к этому руководству, у вас должен быть обычный пользователь без полномочий root с привилегиями sudo, настроенный на обоих ваших серверах — это пользователь, под которым вы должны войти на свои серверы. Вы можете узнать, как настроить учетную запись обычного пользователя, выполнив шаги 1–4 в нашем руководстве по начальной настройке сервера для Ubuntu 14.04.

Если вы хотите иметь доступ к своему веб-серверу через доменное имя, а не через общедоступный IP-адрес, купите доменное имя и следуйте этим инструкциям:

  • Как настроить имя хоста в DigitalOcean
  • Как указать серверы имен DigitalOcean от общих регистраторов доменов

Начнем с установки среды выполнения Node.js на сервер приложений.

Установите Node.js

Мы установим последнюю версию LTS Node.js на сервер приложений.

На сервере приложений давайте обновим списки пакетов apt-get с помощью этой команды:

  1. sudo apt-get update

Затем используйте apt-get для установки пакета git, от которого зависит npm:

  1. sudo apt-get install git

Перейдите на соответствующую страницу и скопируйте эту ссылку.

Перейдите в свой домашний каталог и загрузите исходный код Node.js с помощью wget. Вставьте ссылку для скачивания вместо выделенной части:

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

Теперь извлеките архив tar, который вы только что загрузили, в каталог node с помощью следующих команд:

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

Если вы хотите удалить загруженный архив Node.js, так как он нам больше не нужен, перейдите в свой домашний каталог и используйте эту команду rm:

  1. cd ~
  2. rm -rf node-v*

Далее мы настроим глобальный prefix для npm, где npm будет создавать символические ссылки на установленные пакеты Node, где-то в вашем путь по умолчанию. Мы установим его в /usr/local с помощью этой команды:

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

Теперь мы готовы переместить двоичные файлы node и npm в место установки. Мы переместим его в /opt/node с помощью этой команды:

  1. sudo mv node /opt/

На этом этапе вы можете захотеть сделать root владельцем файлов:

  1. sudo chown -R root: /opt/node

Наконец, давайте создадим символические ссылки на двоичные файлы node и npm по вашему пути по умолчанию. Мы поместим ссылки в /usr/local/bin с помощью следующих команд:

  1. sudo ln -s /opt/node/bin/node /usr/local/bin/node
  2. sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

Убедитесь, что Node установлен, проверив его версию с помощью этой команды:

  1. node -v

Среда выполнения Node.js теперь установлена и готова к запуску приложения! Давайте напишем приложение Node.js.

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

Теперь мы создадим приложение Hello World, которое просто возвращает «Hello World» на любые HTTP-запросы. Это пример приложения, которое поможет вам настроить Node.js, которым вы сможете его заменить. с вашим собственным приложением — просто убедитесь, что вы изменили свое приложение, чтобы прослушивать соответствующие IP-адреса и порты.

Поскольку мы хотим, чтобы наше приложение Node.js обслуживало запросы, поступающие с нашего обратного прокси-сервера, web, мы будем использовать частный сетевой интерфейс нашего сервера приложений для связи между серверами. Найдите частный сетевой адрес вашего сервера приложений.

Если вы используете дроплет DigitalOcean в качестве своего сервера, вы можете найти частный IP-адрес сервера через службу Метаданные. На сервере приложений используйте команду curl, чтобы получить IP-адрес прямо сейчас:

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

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

Привет, мировой код

Затем создайте и откройте приложение Node.js для редактирования. В этом руководстве мы будем использовать vi для редактирования примера приложения с именем hello.js:

  1. cd ~
  2. vi hello.js

Вставьте следующий код в файл и обязательно замените частный IP-адрес сервера приложений для обоих выделенных элементов APP_PRIVATE_IP_ADDRESS. При желании вы также можете заменить выделенный порт 8080 в обоих местах (обязательно используйте порт без прав администратора, т. е. 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/');

Теперь сохраните и выйдите.

Это приложение Node.js просто прослушивает указанный IP-адрес и порт и возвращает «Hello World» с кодом успеха HTTP 200. Это означает, что приложение доступно только с серверов на том же частном сети, такой как наш веб-сервер.

Тестовое приложение (необязательно)

Если вы хотите проверить, работает ли ваше приложение, запустите эту команду node на сервере приложений:

  1. node hello.js

Примечание. Запуск приложения Node.js таким образом блокирует дополнительные команды до тех пор, пока приложение не будет завершено нажатием CTRL+C.

Чтобы протестировать приложение, откройте другой сеанс терминала и подключитесь к своему веб-серверу. Поскольку веб-сервер находится в той же частной сети, он должен иметь доступ к частному IP-адресу сервера приложений с помощью curl. Не забудьте заменить частный IP-адрес сервера приложений на APP_PRIVATE_IP_ADDRESS и порт, если вы его изменили:

  1. curl http://APP_PRIVATE_IP_ADDRESS:8080

Если вы видите следующий вывод, приложение работает правильно и прослушивает правильный IP-адрес и порт:

Output:
Hello World

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

На сервере приложений обязательно завершите приложение (если вы еще этого не сделали), нажав CTRL+C.

Установить PM2

Теперь мы установим PM2, менеджер процессов для приложений Node.js. PM2 предоставляет простой способ управления и демонизации приложений (запуск их как службы).

Мы будем использовать Node Packaged Modules (NPM), который по сути представляет собой менеджер пакетов для модулей Node, устанавливаемых с помощью Node.js, для установки PM2 на наш сервер приложений. Используйте эту команду для установки PM2:

  1. sudo npm install pm2 -g

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

PM2 прост и удобен в использовании. Мы рассмотрим несколько основных способов использования PM2.

Запустить приложение

Первое, что вам нужно сделать, это использовать команду pm2 start для запуска приложения hello.js в фоновом режиме:

  1. pm2 start hello.js

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

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

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

Приложения, работающие под управлением PM2, будут автоматически перезапущены в случае сбоя или уничтожения приложения, но необходимо выполнить дополнительный шаг, чтобы приложение запускалось при запуске системы (загрузка или перезагрузка). К счастью, PM2 предоставляет простой способ сделать это с помощью подкоманды startup.

Подкоманда startup создает и настраивает сценарий запуска для запуска PM2 и управляемых им процессов при загрузке сервера. Вы также должны указать платформу, на которой вы работаете, в нашем случае это ubuntu:

  1. pm2 startup ubuntu

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

Output:
[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 sammy --hp /home/sammy"

Запустите сгенерированную команду (аналогично выделенному выше выводу), чтобы настроить PM2 на запуск при загрузке (используйте команду из собственного вывода):

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

Другое использование PM2 (необязательно)

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

Остановите приложение этой командой (укажите PM2 Имя приложения или id):

  1. pm2 stop example

Перезапустите приложение этой командой (укажите PM2 Имя приложения или id):

  1. pm2 restart example

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

  1. pm2 list

Дополнительную информацию о конкретном приложении можно найти с помощью подкоманды info (укажите имя приложения или id PM2)::

  1. pm2 info example

Монитор процессов PM2 можно вызвать с помощью подкоманды monit. Это отображает состояние приложения, ЦП и использование памяти:

  1. pm2 monit

Теперь, когда ваше приложение Node.js запущено и управляется PM2, давайте настроим обратный прокси-сервер.

Настройка обратного прокси-сервера

Теперь, когда ваше приложение запущено и прослушивает частный IP-адрес, вам нужно настроить способ доступа к нему для ваших пользователей. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси-сервера. В этом руководстве мы настроим сервер Nginx с нуля. Если у вас уже есть настроенный сервер Nginx, вы можете просто скопировать блок location в блок сервера по вашему выбору (убедитесь, что местоположение не конфликтует ни с каким существующим содержимым вашего веб-сервера).

На веб-сервере давайте обновим списки пакетов apt-get с помощью этой команды:

  1. sudo apt-get update

Затем установите Nginx с помощью apt-get:

  1. sudo apt-get install nginx

Теперь откройте файл конфигурации блока сервера по умолчанию для редактирования:

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

Удалите все в файле и вставьте следующую конфигурацию. Обязательно замените директиву server_name своим собственным доменным именем (или IP-адресом, если у вас не настроен домен), а частный IP-адрес сервера приложений вместо APP_PRIVATE_IP_ADDRESS. Кроме того, измените порт (8080), если ваше приложение настроено на прослушивание другого порта:

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;
    }
}

Это настраивает веб-сервер для ответа на запросы в его корне. Предполагая, что наш сервер доступен по адресу example.com, при доступе к http://example.com/ через веб-браузер будет отправлен запрос на частный IP-адрес сервера приложений на порту 8080, который будет получен и отправлен приложением Node.js.

Вы можете добавить дополнительные блоки location в тот же блок сервера, чтобы обеспечить доступ к другим приложениям на том же веб-сервере. Например, если вы также запускали другое приложение Node.js на сервере приложений через порт 8081, вы можете добавить этот блок местоположения, чтобы разрешить доступ к нему через http://example.com. /приложение2:

    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:

  1. sudo service nginx restart

Предполагая, что ваше приложение Node.js запущено и ваше приложение и конфигурации Nginx верны, вы сможете получить доступ к своему приложению через обратный прокси-сервер веб-сервера. Попробуйте это, открыв URL-адрес вашего веб-сервера (его общедоступный IP-адрес или доменное имя).

Заключение

Поздравляем! Теперь у вас есть приложение Node.js, работающее за обратным прокси-сервером Nginx на серверах Ubuntu 14.04. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться. Удачи в разработке Node.js!

Кроме того, если вы хотите зашифровать передачу между вашим веб-сервером и вашими пользователями, вот руководство, которое поможет вам настроить поддержку HTTPS (TLS/SSL).