Часть 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.