Вступление
Node.js - среда выполнения JavaScript с открытым исходным кодом для создания серверных и сетевых приложений. Платформа работает на Linux, macOS, FreeBSD и Windows. Хотя вы можете запускать приложения Node.js из командной строки, этот учебник будет посвящен запуску их как службы. Это означает, что приложения будут перезагружаться при перезагрузке или сбое и безопасны для использования в производственной среде.
В этом руководстве вы настроите готовую к работе среду Node.js на одном сервере Debian 10. На этом сервере будет запущено приложение Node.js. Сервер Nginx будет предлагать HTTPS, используя бесплатный сертификат, предоставленный Let’s Encrypt.
Предпосылки
В этом руководстве предполагается, что у вас есть следующее:
-
Настройка сервера Debian 10, как описано в https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10 руководство по настройке сервера libeinitial для Debian 10]. У вас должен быть пользователь без полномочий root с привилегиями
+ sudo +
и активным брандмауэром. -
Https://www.digitalocean.com/docs/networking/dns/quickstart/[domain имя, указывающее на публичный IP вашего сервера].
-
Nginx установлен, как описано в Как установить Nginx на Debian 10.
-
Nginx настроен с использованием SSL с использованием сертификатов Let Encrypt. How для защиты Nginx с помощью Let’s Encrypt на Debian 10 проведет вас через процесс.
После выполнения предварительных условий у вас будет сервер, обслуживающий страницу-заполнитель вашего домена по умолчанию по адресу + 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. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться.