Вступление
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. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться.