Как развернуть веб-приложение Node.js?

How to Deploy a Node.js Web Application_
How to Deploy a Node.js Web Application_

Node.js – это среда выполнения JavaScript, которая позволяет выполнять код JavaScript вне браузера.

Node.js построен на JavaScript-движке Chrome V8 и имеет событийно-ориентированную, неблокирующую модель ввода-вывода, что делает его очень эффективным для создания приложений на стороне сервера.

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

Кроме того, вы бесплатно соберете, докеризуете и развернете приложение Node.js в контейнерах Back4app.

Преимущества Node.js для разработки веб-приложений

С момента выхода Node.js в 2009 году он стал основным выбором для создания серверных веб-приложений. Вот некоторые из причин.

Эффективность и масштабируемость

Как уже говорилось, Node.js работает на движке V8 в Chrome, который позволяет выполнять код JavaScript. Этот движок использует компиляцию Just-in-time (JIT) для преобразования родного кода JavaScript в машинный код.

Во время работы компоненты V8 Turbofan и Crankshaft анализируют машинный код и перекомпилируют его, чтобы обеспечить наилучшую производительность.

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

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

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

Неглубокая кривая обучения

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

Это снижает сложность веб-разработки и упрощает процесс разработки.

Крупная экосистема

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

Менеджер пакетов Node.js, npm, содержит более миллиона пакетов, которые вы можете использовать для добавления функциональности в свои приложения.

Эти пакеты могут варьироваться от небольших библиотек-утилит, таких как lodash, до крупных фреймворков Nest.js, которые можно использовать для создания сложных веб-приложений.

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

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

Ограничения Node.js для разработки веб-приложений

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

Большое потребление памяти

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

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

Асинхронная модель программирования

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

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

Кроме того, асинхронное программирование может привести к аду обратных вызовов – ситуации, когда код становится трудно читать и поддерживать из-за вложенных обратных вызовов.

Однопоточный цикл обработки событий

Node.js предназначен для выполнения задач с интенсивным вводом-выводом, таких как сетевое взаимодействие, ввод-вывод файлов и операции с базами данных.

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

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

Если выполнение задачи занимает много времени, она может заблокировать цикл событий и сделать приложение невосприимчивым.

Развертывание веб-приложения Node.js

Существует множество способов развертывания приложения Node.js. Давайте рассмотрим некоторые из них.

Услуги облачного хостинга

Услуги облачного хостинга позволяют развернуть приложение Node.js на серверах, управляемых такими компаниями, как Amazon Web Services (AWS), Google Cloud Platform (GCP) или Microsoft Azure.

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

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

Некоторые примеры облачных хостингов для Node.js включают:

  • AWS Elastic Beanstalk
  • GCP App Engine
  • Microsoft Azure App Service

Эти платформы позволяют легко развертывать, масштабировать и управлять приложениями Node.js, не заботясь о базовой инфраструктуре.

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

Виртуальные частные серверы (VPS)

Виртуальные частные серверы (VPS) – это виртуальные машины, работающие на физических серверах, позволяющие установить и запустить ваше приложение Node.js так, как если бы оно работало на выделенном сервере.

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

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

Некоторые примеры VPS-хостинг-провайдеров для Node.js включают:

  • DigitalOcean
  • Linode
  • Vultr

Контейнеризация

Контейнеризация – это технология развертывания и запуска приложений в контейнерной среде, которая изолирует их от базовой инфраструктуры.

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

Они переносимы, что позволяет создавать и тестировать приложения на локальных машинах, а затем развертывать их на любой платформе, поддерживающей контейнеризацию.

Контейнеры также можно легко увеличивать или уменьшать в зависимости от рабочей нагрузки, что обеспечивает повышенную масштабируемость. Они обеспечивают согласованность на разных платформах, что упрощает управление и поддержку приложений.

В качестве примера платформ, предлагающих услуги контейнеризации как сервиса (CaaS), можно привести следующие:

  • Back4app Containers
  • AWS ECS
  • Azure ACI
  • Google GKE

Развертывание приложения Node.js на Back4app с помощью контейнеров Back4app

Back4app – это облачная платформа, которая позволяет создавать, управлять и развертывать веб-приложения с помощью интуитивно понятного пользовательского интерфейса или полнофункционального инструмента CLI. Back4app предлагает ряд услуг, одной из которых является контейнеризация.

Контейнеры Back4app устраняют разрыв между разработкой и производством, автоматизируя повторяющиеся задачи и управляя инфраструктурой на стороне сервера, что позволяет не беспокоиться о DevOps.

В этой статье вы построите и развернете простое Node.js-приложение с помощью контейнеров Back4app. Приложение Node.js, которое вы будете создавать, представляет собой простой API книжного магазина с поддержкой функциональности CRUD (Create, Read, Update, Delete).

Настройка среды разработки

Создайте новый каталог проекта и инициализируйте npm в каталоге проекта, выполнив следующую команду:

mkdir bookstoreapp && cd bookstoreapp && npm init -y

Затем установите необходимые зависимости для проекта, выполнив приведенную ниже команду:

npm install express dotenv mysql knex

Выше были установлены следующие зависимости:

  • Express.js: Express – это фреймворк Node.js, который упрощает процесс разработки приложений Node.js.
  • dotenv: dotenv – это пакет npm, который можно использовать для управления переменными окружения.
  • MySQL: Зависимость MySQL – это драйвер Node.js для MySQL, который вы будете использовать в качестве базы данных для этого приложения.
  • Knex: Knex – это конструктор запросов для JavaScript. Вам понадобится эта зависимость, чтобы взаимодействовать с базой данных без написания необработанных SQL-запросов.

Затем создайте файлы routes.js и index.js в корневом каталоге проекта.

Затем добавьте приведенный ниже блок кода в файл index.js:

//index.js
require("dotenv").config();
const express = require("express");
const app = express();
const port = 3000;
const router = require("./routes.js");

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/", router);

app.listen(port, () => {
  console.log(`App listening at ${port}`);
});

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

Наконец, он запускает сервер и выводит в консоль сообщение о том, что сервер запущен и прослушивает указанный порт.

Затем добавьте стартовый скрипт в файл package.json. Например:

"start": "node index.js",

Подключение к базе данных

Для работы Knex требуется файл knex, содержащий параметры конфигурации для подключения к базе данных.

Выполните приведенную ниже команду, чтобы создать файл knex:

knex init

Чтобы настроить Knex на использование MySQL, замените содержимое вашего файла knexfile.js на блок кода ниже:

// Update with your config settings.

require("dotenv").config()

/**
 * @type { Object.<string, import("knex").Knex.Config> }
 */
module.exports = {
  development: {
    client: "mysql",
    connection: {
      host: process.env.DEV_HOST,
      user: process.env.DEV_USER,
      password: process.env.DEV_PASSWORD,
      database: process.env.DEV_NAME,
    },
    migrations: {
      directory: "./db/migrations",
    }
  },
  production: {
    client: "mysql",
    connection: {
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
    },
    migrations: {
      directory: "./db/migrations",
    }
  },
};

Затем создайте папку db в корневом каталоге проекта и создайте файл db.js.

Добавьте приведенный ниже блок кода в файл db.js:

//db.js

const knex = require("knex");
const knexFile = require("../knexfile.js");

const environment = process.env.NODE_ENV || "development";

module.exports = knex(knexFile[environment]);

Приведенный выше блок кода устанавливает переменную окружения либо в значение переменной окружения NODE_ENV, либо в значение development, если NODE_ENV не установлено. Таким образом, вы можете задать различные конфигурации для разных окружений, таких как development или production.

Создание файлов миграции

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

knex migrate:make bookstore

Приведенная выше команда создает файл миграции в указанном knexfile.js пути к файлу (“./db/migrations”).

Затем откройте файл миграции и замените в нем код на блок кода, приведенный ниже:

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.up = function (knex) {
  return knex.schema.createTable("books", (table) => {
    table.increments("id").primary();
    table.string("title");
    table.string("author");
    table.string("genre");
    table.timestamps(true, true);
  });
};

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.down = function (knex) {
  return knex.schema.dropTableIfExists("books");
};

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

knex migrate:latest

Реализация маршрутизации

Наконец, добавьте приведенный ниже блок кода в файл routes.js:

const express = require("express");
const router = express.Router();
const db = require("./db/db.js");

// GET /books
router.get("/books", async (req, res) => {
  try {
    const books = await db("books");
    res.json(books);
  } catch (err) {
    console.error(err);
    res.status(500).send("Internal Server Error");
  }
});

//POST /books/new
router.post("/books/new", async (req, res) => {
  try {
    const { title, author, genre } = req.body;
    const book = await db("books").insert({
      title,
      author,
      genre,
    });
    res.status(201).json(book);
  } catch (err) {
    console.error(err);
    res.status(500).send("Internal Server Error");
  }
});

//PUT /books/:id
router.put("/books/:id", async (req, res) => {
  const { id } = req.params;

  try {
    const { title, author, genre } = req.body;
    const book = await db("books").where({ id }).update(
      {
        title,
        author,
        genre,
      },
      ["id", "title", "author", "genre"]
    );

    if (book.length !== 0) {
      res.status(201).send(book);
    } else {
      res.status(404).json({ error: "Book not found" });
    }
  } catch (err) {
    console.error(err);
    res.status(500).send("Internal Server Error");
  }
});

//DELETE /books/:id
router.delete("/books/:id", async (req, res) => {
  const { id } = req.params;

  try {
    const book = await db("books").where({ id }).del();

    if (book !== 0) {
      res.status(200).json({ message: "Book deleted" });
    } else {
      res.status(404).json({ error: "Book not found" });
    }
  } catch (err) {
    console.error(err);
    res.status(500).send("Internal Server Error");
  }
});

module.exports = router;

В приведенном выше блоке кода определено несколько маршрутов для обработки HTTP-запросов, включая получение всех книг, создание новой книги, обновление существующей книги и удаление книги.

Создание Dockerfile

Dockerfile – это файл, содержащий набор инструкций, написанных в определенном формате, по созданию образа Docker. Образ Docker – это снимок контейнера, который содержит все необходимое для запуска приложения: код приложения, среду выполнения, библиотеки и системные инструменты.

Чтобы запустить приложение Node.js на контейнерах Back4app Containers, необходимо создать Dockerfile, содержащий инструкции по сборке образа Docker.

Выполните приведенную ниже команду, чтобы создать Dockerfile:

touch Dockerfile

Далее вам нужно выбрать базовый образ для вашего приложения Node.js. Базовый образ в Docker – это отправная точка для создания нового образа Docker. Это основа, на которой строится ваш образ Docker.

Добавьте приведенный ниже блок кода в свой Dockerfile, чтобы указать базовый образ:

# Specify base image
FROM node:18-alpine

В этой строке указывается базовый образ, на основе которого будет построен этот Docker-образ. В данном случае версия Node.js 18 работает на дистрибутиве Alpine Linux.

Далее необходимо указать рабочий каталог. Все последующие команды в Dockerfile будут выполняться относительно этой директории.

Добавьте приведенный ниже блок кода в свой Dockerfile, чтобы указать рабочий каталог:

# Specify working directory
WORKDIR /app

Затем необходимо скопировать файлы package.json и package-lock.json из текущего каталога (т.е. каталога, содержащего Dockerfile) в рабочий каталог(/app).

Добавьте приведенный ниже блок кода в свой Dockerfile, чтобы скопировать файлы:

# Copy package.json and package-lock.json
COPY package*.json ./

Далее необходимо выполнить команду npm install в рабочей директории, чтобы установить зависимости Node.js, перечисленные в package.json и package-lock.json.

Добавьте приведенный ниже код в свой Dockerfile для установки зависимостей:

# Install dependencies
RUN npm install

Приведенная выше команда установит все зависимости, перечисленные в ваших файлах package.json **** и package-lock.json, и сохранит их в папке node_modules в указанном рабочем каталоге.

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

Добавьте приведенный ниже блок кода в свой Dockerfile, чтобы скопировать исходный код:

# Copy source code
COPY . .

Далее необходимо открыть порт на хост-машине. Открытие порта позволяет контейнеру Docker принимать входящие сетевые соединения на открытый порт при его запуске.

Добавьте приведенный ниже блок кода в ваш Dockerfile, чтобы открыть порт 3000 для хост-машины:

# Expose port 3000
EXPOSE 3000

Наконец, нужно указать команду, которая должна выполняться при запуске контейнера Docker. Обычно приложения Node.js запускаются с помощью команды npm start.

Добавьте приведенный ниже блок кода в свой Dockerfile, чтобы задать команду:

# Run the app
CMD ["npm", "start"]

Ваш готовый Dockerfile должен выглядеть так, как показано в блоке кода ниже:

# Specify base image
FROM node:18-alpine

# Specify working directory
WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy source code
COPY . .

# Expose port 3000
EXPOSE 3000

# Run the app
CMD ["npm", "start"]

После создания Dockerfile отправьте код на GitHub.

Создание нового приложения Back4app

Первым шагом к развертыванию приложения Node.js на Back4app является создание учетной записи на Back4app (если у вас ее нет). Вы можете создать его, выполнив следующие шаги.

  1. Перейдите на веб-сайт Back4app.
  2. Затем нажмите кнопку ” Зарегистрироваться ” в правом верхнем углу целевой страницы.
  3. Наконец, заполните форму регистрации и отправьте ее.

После успешного создания учетной записи Back4app, войдите в свою учетную запись Back4app и нажмите кнопку NEW APP в правом верхнем углу.

Нажав на эту кнопку, вы попадете на страницу, где нужно выбрать “Как вы хотите создать свое новое приложение?”. Поскольку вы развертываете приложение с помощью контейнеризации, выберите “Контейнеры как сервис”, как показано на рисунке ниже.

Создайте новое приложение на Back4app

Затем подключите свой аккаунт GitHub к аккаунту Back4app. Вы можете предоставить Back4app доступ ко всем репозиториям в вашем аккаунте или к определенным репозиториям.

Выберите приложение, которое вы хотите развернуть, в данном случае приложение, которое вы создали в этом уроке, и нажмите кнопку Выбрать.

Выберите репозиторий GitHub для развертывания

Нажав на кнопку выбора, вы попадете на страницу, где вам нужно будет заполнить некоторую информацию о вашем приложении, такую как название, ветвь, корневой каталог и переменные окружения.

Детали для вашего контейнера back4app

Обязательно заполните все переменные среды, которые необходимы вашему приложению для работы. После того как вы заполнили все необходимые данные, нажмите кнопку Создать приложение, как показано на рисунке ниже.

Контейнеры Back4app заполняют информационную страницу с выделенной кнопкой создания приложения

Нажатие кнопки Create App запускает процесс развертывания. После завершения процесса развертывания в левом углу экрана будет указан URL-адрес, по которому можно получить доступ к развернутому приложению, как показано на рисунке ниже.

Страница развертывания контейнеров Back4app.

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

Заключение

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

Несмотря на эти ограничения, для приложений Node.js существует несколько вариантов развертывания, включая Back4app, который предоставляет надежную и удобную платформу для хостинга и управления приложениями Node.js.

Создав приложение Node.js и выполнив шаги, описанные в этой статье, вы сможете легко развернуть свои приложения Node.js на Back4app и воспользоваться его многочисленными преимуществами.

Все еще интересуетесь развертыванием и хостингом Node.js? Ознакомьтесь с этими двумя учебниками:

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Как развернуть веб-приложение Node.js?

– Настройте среду разработки
– Подключитесь к базе данных
– Создайте файлы миграции
– Реализуйте маршрутизацию
– Создайте Dockerfile
– Создайте новое приложение Back4app


Leave a reply

Your email address will not be published.