Как настроить приложение Node.js для работы в Rocky Linux 9
Введение
Node.js — это среда выполнения JavaScript с открытым исходным кодом для создания серверных и сетевых приложений. Платформа работает на Linux, macOS, FreeBSD и Windows. Хотя вы можете запускать приложения Node.js из командной строки, в этом руководстве мы сосредоточимся на их запуске как службы. Это означает, что они будут перезапущены при перезагрузке или сбое и безопасны для использования в производственной среде.
В этом руководстве вы настроите готовую к работе среду Node.js на одном сервере Rocky Linux 9. На этом сервере будет запущено приложение Node.js, управляемое Let’s Encrypt.
Предпосылки
В этом руководстве предполагается, что у вас есть следующее:
- Настройка сервера Rocky Linux 9, как описано в руководстве по первоначальной настройке сервера для Rocky Linux 9. У вас должен быть пользователь без полномочий root с привилегиями sudo и активным брандмауэром.
- Пример.com повсюду.
- Установлен Nginx, как описано в разделе Установка Nginx в Rocky Linux 9.
- Nginx настроен на SSL с использованием сертификатов Let’s Encrypt. Как защитить Nginx с помощью Let’s Encrypt в Rocky Linux 9 поможет вам в этом.
- Node.js установлен на вашем сервере. Как установить Node.js на Rocky Linux 9
Когда вы выполните предварительные условия, у вас будет сервер, обслуживающий страницу-заполнитель вашего домена по умолчанию по адресу https://example.com/
.
Шаг 1 — Создание приложения Node.js
Давайте напишем приложение Hello World, которое возвращает «Hello World» на любые HTTP-запросы. Этот пример приложения поможет вам начать работу с Node.js. Вы можете заменить его своим собственным приложением — просто убедитесь, что вы изменили свое приложение для прослушивания соответствующих IP-адресов и портов.
Текстовый редактор по умолчанию, поставляемый с Rocky Linux 9, называется vi
. vi
— чрезвычайно мощный текстовый редактор, но он может быть несколько бестолковым для пользователей, не имеющих опыта работы с ним. Возможно, вы захотите установить более удобный редактор, такой как nano
, чтобы упростить редактирование файлов конфигурации на вашем сервере Rocky Linux 9:
- sudo dnf install nano
Теперь с помощью nano
или вашего любимого текстового редактора создайте пример приложения с именем hello.js
:
- 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}/`);
});
Сохраните файл и выйдите из редактора. Если вы используете nano
, нажмите Ctrl+X
, затем, когда будет предложено, Y
, а затем Enter.
Это приложение Node.js прослушивает указанный адрес (localhost
) и порт (3000
) и возвращает \Hello World! с кодом успеха HTTP 200
. Поскольку мы прослушиваем localhost
, удаленные клиенты не смогут подключиться к нашему приложению.
Чтобы протестировать приложение, введите:
- node hello.js
Вы получите следующий вывод:
OutputServer running at http://localhost:3000/
Примечание. Запуск приложения Node.js таким образом блокирует дополнительные команды до тех пор, пока приложение не будет завершено нажатием CTRL+C
.
Чтобы протестировать приложение, откройте другой сеанс терминала на своем сервере и подключитесь к localhost
с помощью curl
:
- curl http://localhost:3000
Если вы получите следующий вывод, приложение работает правильно и прослушивает правильный адрес и порт:
OutputHello World!
Если вы не получили ожидаемого результата, убедитесь, что ваше приложение Node.js запущено и настроено для прослушивания правильного адреса и порта.
Убедившись, что оно работает, завершите приложение (если вы еще этого не сделали), нажав CTRL+C
.
Шаг 2 — Установка PM2
Далее давайте установим PM2, диспетчер процессов для приложений Node.js. PM2 позволяет демонизировать приложения, чтобы они работали в фоновом режиме как служба.
Используйте npm
для установки последней версии PM2 на свой сервер:
- sudo npm install pm2@latest -g
Параметр -g
указывает npm
установить модуль глобально, чтобы он был доступен для всей системы.
Давайте сначала воспользуемся командой pm2 start
для запуска вашего приложения hello.js
в фоновом режиме:
- 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.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
Как указано выше, PM2 автоматически назначает имя приложения
(на основе имени файла, без расширения .js
) и id
PM2. PM2 также поддерживает другую информацию, такую как PID
процесса, его текущий статус и использование памяти.
Приложения, работающие под управлением PM2, будут автоматически перезапущены в случае сбоя или уничтожения приложения, но мы можем сделать дополнительный шаг, чтобы заставить приложение запускаться при запуске системы с помощью подкоманды startup
. Эта подкоманда создает и настраивает сценарий запуска для запуска PM2 и его управляемых процессов при загрузке сервера:
- pm2 startup systemd
Output…
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Скопируйте и запустите предоставленную команду (чтобы избежать проблем с разрешениями при запуске инструментов Node.js как sudo
):
- sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Output…
[ 'systemctl enable pm2-sammy' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-sammy.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-sammy...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-sammy.service → /etc/systemd/system/pm2-sammy.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save
[PM2] Remove init script via:
$ pm2 unstartup systemd
Теперь вам нужно внести изменения в только что созданную системную службу, чтобы сделать ее совместимой с системой безопасности SELinux Rocky Linux. Используя nano
или ваш любимый текстовый редактор, откройте /etc/systemd/system/pm2-sammy.service
:
- sudo nano /etc/systemd/system/pm2-sammy.service
В блоке [Service]
файла конфигурации замените содержимое параметра PIDFile
на /run/pm2.pid
, как показано ниже, и добавьте другую выделенную строку Environment
:
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target
[Service]
Type=forking
User=sammy
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/home/sammy/.local/bin:/home/sammy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/sammy/.pm2
PIDFile=/run/pm2.pid
Restart=on-failure
Environment=PM2_PID_FILE_PATH=/run/pm2.pid
ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/local/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill
[Install]
Сохраните и закройте файл. Вы создали системный модуль, который запускает pm2
для вашего пользователя при загрузке. Этот экземпляр pm2
, в свою очередь, запускает hello.js
.
Запустите службу с помощью systemctl
:
- sudo systemctl start pm2-sammy
Проверьте состояние модуля systemd:
- systemctl status pm2-sammy
Подробный обзор systemd см. в статье Systemd Essentials: работа со службами, модулями и журналом.
В дополнение к тем, которые мы рассмотрели, PM2 предоставляет множество подкоманд, которые позволяют вам управлять или искать информацию о ваших приложениях.
Остановите приложение этой командой (укажите PM2 Имя приложения
или id
):
- pm2 stop app_name_or_id
Перезапустите приложение:
- pm2 restart app_name_or_id
Перечислите приложения, которыми в настоящее время управляет PM2:
- pm2 list
Получите информацию о конкретном приложении, используя его имя приложения
:
- pm2 info app_name
Монитор процессов PM2 можно вызвать с помощью подкоманды monit
. Это отображает состояние приложения, ЦП и использование памяти:
- pm2 monit
Обратите внимание, что запуск pm2
без каких-либо аргументов также отобразит страницу справки с примерами использования.
Теперь, когда ваше приложение Node.js запущено и управляется PM2, давайте настроим обратный прокси-сервер.
Шаг 3 — Настройка Nginx в качестве обратного прокси-сервера
Ваше приложение работает и прослушивает localhost
, но вам нужно настроить способ, которым ваши пользователи смогут получить к нему доступ. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси-сервера.
В предварительном руководстве вы настроили конфигурацию Nginx в файле /etc/nginx/conf.d/your_domain.conf
. Откройте этот файл для редактирования:
- sudo nano /etc/nginx/conf.d/your_domain.conf
В блоке 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;
}
...
}
Это настраивает сервер для ответа на запросы в его корне. Предполагая, что наш сервер доступен по адресу ваш_домен
, доступ к https://ваш_домен/
через веб-браузер приведет к отправке запросить hello.js
, прослушивая порт 3000
на localhost
.
Вы можете добавить дополнительные блоки location
в тот же блок сервера, чтобы обеспечить доступ к другим приложениям на том же сервере. Например, если вы также запускали другое приложение Node.js на порту 3001
, вы можете добавить этот блок местоположения, чтобы разрешить доступ к нему через https://ваш_домен/приложение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;
}
...
}
Когда вы закончите добавлять блоки местоположения для своих приложений, сохраните файл и выйдите из редактора.
Убедитесь, что вы не внесли никаких синтаксических ошибок, набрав:
- sudo nginx -t
Перезапустите Nginx:
- sudo systemctl restart nginx
Предполагая, что ваше приложение Node.js запущено и ваше приложение и конфигурации Nginx верны, теперь вы сможете получить доступ к своему приложению через обратный прокси-сервер Nginx. Попробуйте это, открыв URL-адрес вашего сервера (его общедоступный IP-адрес или доменное имя).
Заключение
Поздравляем! Теперь у вас есть приложение Node.js, работающее за обратным прокси-сервером Nginx на сервере Rocky Linux 9. Эта настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, которым вы хотите поделиться.
Далее вы можете изучить Как создать приложение Node.js с помощью Docker.