Как развернуть сервер Node.js с помощью AWS EC2, nginx и SSL

Итак, вы только что закончили разработку бэкенда на Node.js, но что теперь? Пришло время сделать его живым, чтобы вы могли использовать его в реальном проекте.

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

Этот пост был написан в сотрудничестве с Эдвалдо Гджоникаджем.

Создание экземпляра EC2

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

Прежде всего, вам необходимо иметь учетную запись AWS. Если у вас ее нет, вы можете создать ее здесь. Если вы только что зарегистрировались, у вас будет бесплатный уровень на один год, который позволит вам опробовать многие сервисы, включая EC2!

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

Чтобы создать его, выполните следующие шаги:

  1. Зайдите в консоль AWS и найдите службу EC2 (введите ее в строку поиска или просмотрите список служб).

  2. Создайте новый экземпляр

  3. Выберите имя для вашего экземпляра и выберите тип операционной системы, которая будет на нем установлена. Я предпочитаю использовать ubuntu, что является довольно распространенным выбором (примечание: команды, которые мы рассмотрим в этом руководстве, будут действительны только для UNIX-подобных операционных систем).

  4. Убедитесь, что разрешен HTTP и HTTPs трафик. Это откроет порты 80 и 443 для Интернета, чтобы наш экземпляр мог получать HTTP-запросы.

  5. Теперь вам нужно создать пару ключей (или выбрать существующий, если он у вас уже есть) — это своего рода секретный пароль, который мы можем использовать для подтверждения своей личности при подключении к нашему экземпляру. Обязательно скачайте ключ и сохраните его в надежном месте на вашем устройстве. Он понадобится нам позже.

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

Вот и все! Теперь у вас есть виртуальная машина, на которой вы можете развернуть свой сервер Node.js.

Подключение к экземпляру EC2

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

Чтобы подключиться к нашему экземпляру с помощью SSH, нам нужно указать три вещи:

  • публичное DNS-имя или IP-адрес экземпляра, к которому мы хотим подключиться. Нашему экземпляру был автоматически присвоен публичный IPv4-адрес, который мы можем найти на странице сводки экземпляра

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

  • имя пользователя, с которым мы хотим подключиться. В Ubuntu есть пользователь по умолчанию «ubuntu», которого мы можем использовать.

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

chmod 400 <path_to_your_key> 
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем мы можем подключиться к нашему экземпляру с помощью SSH, выполнив эту команду:

ssh ubuntu@<public_IP> -i <path_to_your_key>
Войти в полноэкранный режим Выйти из полноэкранного режима

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

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

Чтобы запустить сервер Node.js, нам, конечно же, нужно установить Node.js на нашу машину.

Это довольно просто, вы можете сделать это, выполнив следующие команды:

sudo apt-get update

sudo apt install nodejs npm
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы проверить, что все прошло успешно, запустите node -v и npm -v, и вы получите установленные версии.

Клонирование репозитория

Следующим шагом будет клонирование репозитория, содержащего код вашего сервера Node.js, чтобы мы могли его выполнить. Git должен быть уже установлен на машине, но вы можете перепроверить, выполнив git --version и запустить sudo apt install git, если это не так.

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

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

Чтобы клонировать репозиторий:

git clone https://github.com/johnpapa/node-hello
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Затем установите зависимости:

cd node-hello

npm install
Войдите в полноэкранный режим Выйти из полноэкранного режима

Настройка nginx

Чтобы сделать наш сервер Node.js доступным через Интернет, мы будем использовать nginx в качестве обратного прокси.

По сути, наш сервер Node.js будет работать на порту, который не будет открыт для Интернета (например, 3000). Затем мы настроим nginx на прослушивание HTTP-запросов на порту 80 (который мы открыли для Интернета при создании нашего экземпляра) и перенаправим входящий трафик на наш Node.js-сервер, который будет отвечать за обработку этих запросов и генерирование ответа.

Возможно, вам интересно, почему мы не запускаем Node.js напрямую на порту 80 и не забываем о nginx. Есть несколько причин выбрать nginx:

  • он более производительный и может обрабатывать большой объем трафика
  • он позволяет нам лучше масштабироваться, если нам это понадобится в дальнейшем
  • упрощает настройку SSL
  • упрощает обработку привилегий и назначение портов.

Итак, теперь, когда мы знаем, что делать, давайте все настроим. Прежде всего, установите nginx:

sudo apt install nginx
Войдите в полноэкранный режим Выйти из полноэкранного режима

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

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

sudo touch /etc/nginx/sites-enabled/<you_app_name>.conf
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь напишите следующую конфигурацию, в которой мы в основном говорим nginx слушать порт 80 и перенаправлять весь входящий трафик на порт 3000, на котором будет работать наш сервер Node.js.

sudo nano /etc/nginx/sites-enabled/<you_app_name>.conf

# write this:
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name <your_domain>;

    location / {
        proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://localhost:3000;
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Если у вас нет домена, указывающего на ваш IPv4-адрес, то вы можете просто указать сам IP-адрес в качестве server_name. Но имейте в виду, что если вы хотите установить SSL, вам понадобится домен (вы всегда можете отредактировать эту конфигурацию позже).

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

sudo rm -rf /etc/nginx/sites-enabled/default
Вход в полноэкранный режим Выйти из полноэкранного режима

Наконец, перезапустите nginx, чтобы изменения вступили в силу:

sudo systemctl reload nginx
Войти в полноэкранный режим Выйти из полноэкранного режима

Запуск сервера Node.js

Отлично, теперь nginx работает и перенаправляет трафик на наш сервер Node. Но наш сервер Node на самом деле еще не запущен, поэтому нам нужно узнать вот что.

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

Поэтому мы будем использовать pm2, менеджер процессов, который поможет нам поддерживать наш сервер в рабочем состоянии.

Чтобы установить pm2:

sudo install pm2 -g
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Затем перейдите в каталог приложений Node и запустите сервер с помощью pm2:

cd node-hello

sudo pm2 start "npm start"
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Чтобы убедиться, что pm2 автоматически запускается при перезапуске сервера, выполните следующие действия:

sudo pm2 startup
Войти в полноэкранный режим Выйти из полноэкранного режима

Настройка SSL

Последний шаг — это настройка SSL, чтобы сделать соединение с нашим сервером безопасным.

Чтобы включить SSL на нашем сервере, нам нужно создать SSL-сертификат и установить его на наш сервер. Сертификат — это, по сути, пара ключей, которая может использоваться для установления зашифрованного соединения.

Для этого вам понадобится домен, поскольку SSL-сертификат привязан к доменному имени, а не к IP-адресу. Чтобы настроить домен, перейдите в консоль провайдера домена и создайте запись A в конфигурации DNS, указывающую на публичный IP-адрес вашего экземпляра.

Если вы перейдете к своему домену с помощью HTTP, вы должны увидеть ответ от вашего сервера. Также убедитесь, что вы указали server_name в качестве вашего домена в конфигурационном файле nginx, если вы не сделали этого раньше.

Для настройки SSL мы будем использовать certbot, инструмент, который помогает нам генерировать бесплатные SSL сертификаты с помощью Let’s Encrypt.

Сначала установите certbot:

sudo apt-get install certbot python3-certbot-nginx
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Затем сгенерируйте SSL-сертификат для домена, который вы назначили своему серверу. Вам нужно будет ответить на некоторые подсказки certbot.

sudo certbot --nginx -d <your_domain_name>
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Готово! Теперь вы можете перейти к своему домену с помощью HTTPs и должны увидеть, что безопасное соединение установлено.

Заключение

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

Я думаю, что умение развернуть сервер с нуля — очень ценный навык для веб-разработчика. Обучение этому помогло мне понять многие концепции, и теперь я имею гораздо более четкое представление о том, как все работает за кулисами. Надеюсь, это руководство было полезным и для вас.

Оцените статью
devanswers.ru
Добавить комментарий