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

Вступление

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

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

Предпосылки

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

  • Настройка сервера Debian 9, как описано в https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 руководство по настройке сервера libeinitial для Debian 9]. У вас должен быть пользователь без полномочий root с правами sudo и активным брандмауэром.

  • Https://www.digitalocean.com/docs/networking/dns/quickstart/[domain имя, указывающее на публичный IP вашего сервера]. В этом руководстве будет использоваться имя домена * example.com *.

  • Nginx установлен, как описано в Как установить Nginx в Debian 9.

  • Nginx настроен с использованием SSL с использованием сертификатов Let Encrypt. How для защиты Nginx с помощью Let’s Encrypt на Debian 9 проведет вас через процесс.

После выполнения предварительных условий у вас будет сервер, обслуживающий страницу-заполнитель вашего домена по умолчанию по адресу + 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@latest -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 и его управляемых процессов при загрузке сервера:

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  --hp /home/

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

pm2 save

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

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

sudo systemctl start pm2-

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

systemctl status pm2-

Подробный обзор 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 / +. Замените содержимое этого блока следующей конфигурацией. Если ваше приложение настроено на прослушивание другого порта, обновите выделенную часть на правильный номер порта:

/etc/nginx/sites-available/example.com

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/example.com - необязательно

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. Попробуйте, перейдя по URL вашего сервера (его общедоступный IP-адрес или доменное имя).

Заключение

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

Related