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

Вступление

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

В этом руководстве вы настроите готовую к работе среду Node.js на одном сервере Debian 10. На этом сервере будет запущено приложение Node.js. Сервер Nginx будет предлагать HTTPS, используя бесплатный сертификат, предоставленный Let’s Encrypt.

Предпосылки

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

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

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

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

Чтобы установить NodeSource PPA и получить доступ к его содержимому, вам сначала необходимо обновить индекс пакета и установить + curl +:

sudo apt update
sudo apt install curl

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

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

Вы можете проверить содержимое этого скрипта с помощью + nano + или вашего https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step-six-%E2%80% 94-завершающая опция-конфигурация [предпочтительный текстовый редактор]:

nano nodesource_setup.sh

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

sudo bash nodesource_setup.sh

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

sudo apt install nodejs

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

nodejs -v
Outputv

Пакет + nodejs + содержит двоичный файл + nodejs +, а также https://www.npmjs.com/ [+ npm +], менеджер пакетов для модулей Node, поэтому вам не нужно устанавливать `+ нпм + `отдельно.

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

npm -v
Output

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

sudo apt install build-essential

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

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

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

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

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

cd ~
nano hello.js

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

~ / 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!» С кодом успеха «+ 200 » HTTP. Поскольку мы слушаем ` localhost +`, удаленные клиенты не смогут подключиться к нашему приложению.

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

node hello.js

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

OutputServer running at http://localhost:3000/

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

curl http://localhost:

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

OutputHello World!

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

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

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

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

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

sudo npm install pm2 -g

Опция + -g + указывает + npm + установить модуль глобально, поэтому он доступен для всей системы.

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

pm2 start

Это также добавляет ваше приложение в список процессов 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 │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│     │ 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 автоматически назначает + App name + на основе имени файла без расширения + .js + вместе с PM2 + id +. PM2 также поддерживает другую информацию, такую ​​как + PID + процесса, его текущее состояние и использование памяти.

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

sudo pm2 startup

Вы увидите вывод, который выглядит примерно так, описывая конфигурацию сервиса, сгенерированную PM2:

Output[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

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

Запустите сервис с помощью + systemctl +:

sudo systemctl start pm2-root.service

Проверьте состояние системного блока:

systemctl status pm2-root.service

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

Output● pm2-root.service - PM2 process manager
  Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
  Active:  since Fri 2019-07-12 16:09:54 UTC; 4s ago

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

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

Остановите приложение с помощью этой команды (укажите PM2 + App name или` + id`):

pm2 stop

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

pm2 restart

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

pm2 list

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

pm2 info

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

pm2 monit

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

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

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

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

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

sudo nano /etc/nginx/sites-available/

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

/ И т.д. / Nginx / сайты Недоступные / your_domain

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

Это настраивает сервер для ответа на запросы в его корне. Предполагая, что наш сервер доступен в ++, доступ к + https: /// + через веб-браузер отправит запрос в + hello.js +, прослушивая порт + 3000 + в + localhost + ,

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

/ etc / nginx / sites-available / your_domain - необязательно

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

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

Заключение

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

Related