Облачные технологии предлагают множество вариантов развертывания приложений. Можно использовать такие сервисы, как Microsoft Azure, Google Cloud или AWS для размещения веб-приложений. Кроме того, можно использовать PaaS-сервисы, такие как Heroku, для простого и быстрого развертывания.

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

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

Подготовка

Прежде чем начать, вам понадобится сервер с установленной операционной системой Linux и учётная запись с правами администратора.

Существует множество виртуальных частных серверов (VPS), доступных на различных надежных платформах. Вы можете выбрать любой VPS-хостинг отвечающий вашим требованиям.

В нашем примере мы будем использовать Ubuntu 20.04.

Чтобы развернуть приложение Node.Js на пустом сервере, нужно выполнить следующие шаги:

  • Установить и настроить Nginx.
  • Установить Node.js и NPM.
  • Установить менеджер процессов PM2.
  • Разместить Node.js приложение на сервере.
  • Настроить обратный прокси и запустить локальный сервер.
  • Начнём с подключения к серверу по ssh.
ssh username@server_ip_address

Адрес сервера и пароль должны находиться в вашем личном кабинете хостинг-провайдера.

Установка и настройка Nginx

Nginx является веб-сервером, используемым для обслуживания статических ресурсов и как обратный прокси-сервер, который перенаправляет запросы клиентов на другие серверы. Он может использоваться в качестве сервера для веб-приложений, написанных на разных языках, включая Node.js.

Nginx доступен в репозитории пакетов для большинства дистрибутивов Linux, что делает его установку простой задачей.


Если на сервере установлен apache2, то его необходимо отключить, так как он полностью настроен для работы на порту 80 в качестве сервера HTTP. Для этого нужно выполнить команду:

sudo apt remove apache2*

После использования этой команды все пакеты apache2 будут недоступны.


Установка Nginx

Для установки Nginx выполните следующие команды:

sudo apt update
sudo apt install nginx

После завершения установки, проверьте статус службы Nginx и убедитесь, что она работает:

sudo systemctl status nginx

Если служба запущена, вы увидите сообщение, подобное этому:

● nginx.service - A high performance web server and a reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: active (running) since Fri 2023-02-19 12:00:00 PST; 1h ago

Важный момент! Следует установить брандмауэр для защиты нашего сервера. Например UFW (Uncomplicated Firewall или «простой брандмауэр»). Однако, я не буду рассматривать эту тему в данном контексте.

Настройка Nginx

После установки Nginx необходимо настроить его для обработки запросов клиентов. Сначала мы создадим конфигурационный файл для нашего домена.

sudo nano /etc/nginx/sites-available/servername.com

Замените servername.com на ваш реальный домен. Также в server_name можно указать ip адрес сервера. Затем добавьте следующий текст в файл:

server {
    server_name servername.com www.servername.com;
    listen 80;
    listen [::]:80;
    root /var/www/servername.com;
    index index.html;
  
    location / {
        try_files $uri $uri/ =404;
    }
}

В этом примере мы создали простой конфигурационный файл для Nginx, который настроен на обслуживание статических файлов, таких как HTML, CSS и JavaScript.

Затем нужно создать символическую ссылку для нашего конфигурационного файла в папке sites-enabled, чтобы Nginx мог использовать его:

sudo ln -s /etc/nginx/sites-available/servername.com /etc/nginx/sites-enabled/

После этого нужно проверить, что конфигурация Nginx корректна:

sudo nginx -t

Если вывод команды nginx -t показывает, что конфигурация корректна, можно перезапустить Nginx с помощью команды:

sudo systemctl restart nginx

Теперь, если открыть веб-браузер и ввести адрес вашего сервера, должна отобразиться страница Nginx по умолчанию.

Страница Nginx по умолчанию!

Установка Node.js

Сначала нам нужно установить Node.js на сервере. Для этого мы будем использовать NVM (Node Version Manager), который позволяет управлять несколькими версиями Node.js на одном сервере. NVM можно загрузить с GitHub.

Установим NVM:

sudo apt install wget

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

После установки перезапустите терминал, чтобы применить изменения.

Если изменения не применились и появляется ошибка Command 'nvm' not found нужно создать .bash_profile

touch .bash_profile

И добавить туда строку

source ~/.nvm/nvm.sh

После этого нужно перезапустить терминал ещё раз.

Затем установим версию Node.js, которую мы хотим использовать. Для примера мы будем использовать версию 18.7.0:

nvm install 18.7.0

После установки команды Node и NPM будут доступны в командной строке. Убедитесь, что версия Node.js правильная, выполнив команду:

node -v

Установка PM2

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

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

Установим PM2:

npm install pm2 -g

Размещение кода приложения на сервере

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

Предположим, что наше приложение app.js основано на простом Node.js или Express сервере. Для запуска процесса необходимо использовать PM2. Добавим наше приложение в PM2 и назовём его “node_server”, чтобы легко его идентифицировать:

pm2 start dev/node_server/app.js --name="node_server"

После успешного запуска приложения вы получите таблицу с данными о запущенных и остановленных приложениях и использовании процессора.

PM2 список приложений!

Для того, чтобы сохранить текущие процессы и синхронизировать их с сохраненным списком, выполните команду:

pm2 save

Это необходимо, чтобы при перезагрузке сервера не потерять все настройки.

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

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

Для этого отредактируйте конфигурационный файл сервера /etc/nginx/sites-available/servername.com:

server {
    server_name servername.com www.servername.com;
    listen 80;
    listen [::]:80;

    location / {
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header Host $host; 
        proxy_set_header X-NginX-Proxy true; 
        proxy_pass http://localhost:3000/; 
        proxy_redirect http://localhost:3000/ https://$server_name/; 
    }
}

После обновления конфигурационного файла и перезапуска Nginx, все запросы, отправленные на сервер, будут перенаправлены в приложение, запущенное на http://localhost:3000.

С помощью проксированных запросов на сервер Node.js будут отправлены пользовательские заголовки - $remote_addr и $host, которые содержат реальный IP-адрес пользователя и имя хоста, на котором запущен сервер.

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