Часть 1. Развертывание нескольких приложений Node.js на одном сервере с помощью SSL, Nginx, PM2

Мотивация

Привет. Допустим, вы закончили кодировать свое замечательное приложение Node.js, готовое к развертыванию на сервере, и хотели разместить его на VPS, или у вас есть более одного приложения для размещения на одном VPS. Как бы Вы это сделали?

Введение

Nginx: веб-сервер или обратный прокси-сервер для обработки входящих запросов.

PM2: диспетчер процессов для управления вашими приложениями Node.js. Например, убедиться, что оно работает все время, даже если оно обнаруживает ошибку, или убедиться, что создано несколько экземпляров одного и того же приложения для использования доступных ядер/потоков приложения (режим кластера). Последняя часть является необязательной.

Certbot: бесплатное управление SSL приложений для ваших доменов с помощью Let’s Encrypt SSL.

Предпосылки

Сервер Ubuntu 20.04 с доступом по SSH и пользователем без полномочий root с привилегиями Sudo.

Шаг 01 — Установка Node.js

Во-первых, чтобы установить Node.js, нам нужно добавить PPA для самой последней версии LTS:

cd ~
curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
# and then 
sudo bash nodesource_setup.sh

После добавления PPA мы можем просто установить Node.js:

sudo apt install nodejs

Чтобы проверить версию Node, которую мы установили, введите:

node -v

И покажет вам точную версию установки, в моем случае это 16.17.0.

Скорее всего, нам понадобится build-essentials для компиляции любого пакета из исходников, так что давайте установим и его.

sudo apt install build-essential

Шаг 02 — Клонируйте проект и установите зависимости

git clone awesomeproject.git
cd awesomeproject
npm install
npm start (or whatever your start command)
# stop app
ctrl+C

Или вы можете создать простое приложение:

cd ~
nano app.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 Everyone!\n');
});
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

А затем запустите его:

node app

В качестве вывода вы получите следующее:

Output
Server running at http://localhost:3000/

Шаг 03 — Настройте PM2

Во-первых, нам нужно установить PM2:

sudo npm i pm2 -g

И для запуска приложения:

pm2 start app  #(or whatever your file name)
#for Cluster mode 
pm2 start app -i max 
#it will create an instance for every available thread 
#optionally you can also pass Number like 2,3 for instances count
# Other pm2 commands
pm2 show app
pm2 status
pm2 restart app
pm2 stop app
pm2 logs (Show log stream)
pm2 flush (Clear logs)
# To make sure app starts when reboot
pm2 startup ubuntu

Приложение должно быть доступно с использованием определенных IP и порта.

Шаг 04 — Настройте брандмауэр UFW

Теперь мы хотим настроить брандмауэр, блокирующий этот порт, и настроить NGINX в качестве обратного прокси-сервера, чтобы мы могли получить к нему прямой доступ, используя порт 80 (http) или порт 443 (https).

sudo ufw enable
sudo ufw status
sudo ufw allow ssh (Port 22) # for SSH
sudo ufw allow http (Port 80)
sudo ufw allow https (Port 443)

Шаг 05 — Установите NGINX и настройте

Установить Nginx довольно просто, просто введите следующее:

sudo apt install nginx

И откройте конфигурацию по умолчанию для редактирования:

sudo nano /etc/nginx/sites-available/default

Добавьте следующее в часть location блока сервера:

server_name yourdomain.com www.yourdomain.com;
    location / {
        proxy_pass http://localhost:3000; #whatever port your app runs on
        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;
    }

Затем проверьте и перезапустите NGINX:

# Check NGINX config
sudo nginx -t
# Restart NGINX
sudo service nginx restart

Теперь вы сможете посетить свой IP-адрес без порта (порт 80) и увидеть свое приложение.

Шаг 06 — Добавление домена

Добавление домена к любому VPS сильно отличается у каждого провайдера. Во-первых, вам нужно зарегистрироваться и добавить запись A, указывающую на IP-адрес VPS или, если ваш провайдер VPS поддерживает это, вы также можете добавить Пользовательские серверы имен, это может занять некоторое время, чтобы появиться.

Шаг 07 — Добавьте SSL с помощью Lets Encrypt

Lets Encrypt предоставляет бесплатный SSL с пакетом certbot, поэтому сначала нам нужно установить пакет:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python3-certbot-nginx

А затем добавьте сертификаты для доменов, которые мы добавили:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

И ваше приложение должно работать на https://yourdomain.com.

Обратите внимание, что мы должны продлевать эти сертификаты каждые 90 дней. Чтобы обновить, запустите:

certbot renew

Мы добавим еще одно приложение в следующей части, следите за новостями! 😃

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord.