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

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


Введение

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

В этом руководстве вы настроите готовую к работе среду Node.js на одном сервере Ubuntu 18.04. На этом сервере будет запущено приложение Node.js, управляемое Let’s Encrypt.

Предпосылки

В этом руководстве предполагается, что у вас есть следующее:

  • Настройка сервера Ubuntu 18.04, как описано в руководстве по первоначальной настройке сервера для Ubuntu 18.04. У вас должен быть пользователь без полномочий root с привилегиями sudo и активным брандмауэром.
  • Пример.com повсюду.
  • Nginx установлен, как описано в разделе Установка Nginx в Ubuntu 18.04.
  • Nginx настроен на SSL с использованием сертификатов Let’s Encrypt. Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 18.04 поможет вам в этом.

Когда вы выполните предварительные условия, у вас будет сервер, обслуживающий страницу-заполнитель вашего домена по умолчанию по адресу https://example.com/.

Шаг 1 — Установка Node.js

Начнем с установки последней версии LTS Node.js, используя архивы пакетов NodeSource.

Сначала установите NodeSource PPA, чтобы получить доступ к его содержимому. Убедитесь, что вы находитесь в своем домашнем каталоге, и используйте curl, чтобы получить скрипт установки для архивов Node.js 8.x:

  1. cd ~
  2. curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh

Вы можете просмотреть содержимое этого скрипта с помощью nano или другого текстового редактора:

  1. nano nodesource_setup.sh

Когда вы закончите проверку скрипта, запустите его под sudo:

  1. sudo bash nodesource_setup.sh

PPA будет добавлен в вашу конфигурацию, и ваш локальный кеш пакетов будет автоматически обновлен. После запуска сценария установки из Nodesource вы можете установить пакет Node.js:

  1. sudo apt install nodejs

Чтобы проверить, какую версию Node.js вы установили после этих начальных шагов, введите:

  1. nodejs -v
Output
v8.11.3

Примечание. При установке из NodeSource PPA исполняемый файл Node.js называется nodejs, а не node.

Пакет nodejs содержит двоичный файл nodejs, а также npm, менеджер пакетов для модулей Node, поэтому вам не нужно устанавливать npm отдельно.

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

  1. npm -v
Output
5.6.0

Чтобы некоторые пакеты npm работали (например, те, которые требуют компиляции кода из исходного кода), вам необходимо установить пакет build-essential:

  1. sudo apt install build-essential

Теперь у вас есть необходимые инструменты для работы с пакетами npm, требующими компиляции кода из исходного кода.

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

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

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

Во-первых, давайте создадим пример приложения с именем hello.js:

  1. cd ~
  2. nano hello.js

Вставьте в файл следующий код:

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

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

Это приложение Node.js прослушивает указанный адрес (localhost) и порт (3000) и возвращает \Hello World! с кодом успеха HTTP 200. Поскольку мы прослушиваем localhost, удаленные клиенты не смогут подключиться к нашему приложению.

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

  1. node hello.js

Вы увидите следующий вывод:

Output
Server running at http://localhost:3000/

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

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

  1. curl http://localhost:3000

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

Output
Hello World!

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

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

Шаг 3 — Установка PM2

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

Используйте npm для установки последней версии PM2 на свой сервер:

  1. sudo npm install pm2@latest -g

Параметр -g указывает npm установить модуль глобально, чтобы он был доступен для всей системы.

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

  1. pm2 start hello.js

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

Output
[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/hello.js in fork_mode (1 instance) [PM2] Done. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤ │ hello │ 0 │ fork │ 1338 │ online │ 0 │ 0s │ 0% │ 23.0 MB │ sammy │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

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

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

  1. pm2 startup systemd

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

Output
[PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Запустите команду из вывода, указав свое имя пользователя вместо sammy:

  1. sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

В качестве дополнительного шага мы можем сохранить список процессов PM2 и соответствующие среды:

  1. pm2 save

Вы создали системный модуль, который запускает pm2 для вашего пользователя при загрузке. Этот экземпляр pm2, в свою очередь, запускает hello.js.

Запустите службу с помощью systemctl:

  1. sudo systemctl start pm2-sammy

Проверьте состояние модуля systemd:

  1. systemctl status pm2-sammy

Подробный обзор systemd см. в статье Systemd Essentials: работа со службами, модулями и журналом.

В дополнение к тем, которые мы рассмотрели, PM2 предоставляет множество подкоманд, которые позволяют вам управлять или искать информацию о ваших приложениях.

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

  1. pm2 stop app_name_or_id

Перезапустите приложение:

  1. pm2 restart app_name_or_id

Перечислите приложения, которыми в настоящее время управляет PM2:

  1. pm2 list

Получите информацию о конкретном приложении, используя его имя приложения:

  1. pm2 info app_name

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

  1. pm2 monit

Обратите внимание, что запуск pm2 без каких-либо аргументов также отобразит страницу справки с примерами использования.

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

Шаг 4 — Настройка Nginx в качестве обратного прокси-сервера

Ваше приложение работает и прослушивает localhost, но вам нужно настроить способ, которым ваши пользователи смогут получить к нему доступ. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси-сервера.

В предварительном руководстве вы настроили конфигурацию Nginx в файле /etc/nginx/sites-available/example.com. Откройте этот файл для редактирования:

  1. sudo nano /etc/nginx/sites-available/example.com

В блоке server у вас должен быть существующий блок location /. Замените содержимое этого блока следующей конфигурацией. Если ваше приложение настроено на прослушивание другого порта, обновите выделенную часть до правильного номера порта:

server {
...
    location / {
        proxy_pass http://localhost:3000;
        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, доступ к https://example.com/ через Интернет браузер отправит запрос hello.js, прослушивая порт 3000 на localhost.

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

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        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;
    }
...
}

Когда вы закончите добавлять блоки местоположения для своих приложений, сохраните файл и выйдите из редактора.

Убедитесь, что вы не внесли никаких синтаксических ошибок, набрав:

  1. sudo nginx -t

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

  1. sudo systemctl restart nginx

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

Заключение

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