Итак, вы только что закончили разработку бэкенда на Node.js, но что теперь? Пришло время сделать его живым, чтобы вы могли использовать его в реальном проекте.
В этом руководстве я покажу вам шаг за шагом, как развернуть ваш сервер Node.js, чтобы вы могли сделать его доступным через Интернет.
Этот пост был написан в сотрудничестве с Эдвалдо Гджоникаджем.
Создание экземпляра EC2
Для того чтобы развернуть наше приложение, нам сначала нужен компьютер, на котором оно будет работать. Для этого есть несколько вариантов, но мы выберем AWS EC2, популярный сервис, который позволяет пользователям арендовать виртуальные машины для запуска своих приложений.
Прежде всего, вам необходимо иметь учетную запись AWS. Если у вас ее нет, вы можете создать ее здесь. Если вы только что зарегистрировались, у вас будет бесплатный уровень на один год, который позволит вам опробовать многие сервисы, включая EC2!
Отлично, теперь, когда у вас есть учетная запись AWS, вы готовы к созданию экземпляра EC2, который, по сути, является виртуальной машиной в облаке для запуска приложений на инфраструктуре AWS.
Чтобы создать его, выполните следующие шаги:
-
Зайдите в консоль AWS и найдите службу EC2 (введите ее в строку поиска или просмотрите список служб).
-
Создайте новый экземпляр
-
Выберите имя для вашего экземпляра и выберите тип операционной системы, которая будет на нем установлена. Я предпочитаю использовать ubuntu, что является довольно распространенным выбором (примечание: команды, которые мы рассмотрим в этом руководстве, будут действительны только для UNIX-подобных операционных систем).
-
Убедитесь, что разрешен HTTP и HTTPs трафик. Это откроет порты 80 и 443 для Интернета, чтобы наш экземпляр мог получать HTTP-запросы.
-
Теперь вам нужно создать пару ключей (или выбрать существующий, если он у вас уже есть) — это своего рода секретный пароль, который мы можем использовать для подтверждения своей личности при подключении к нашему экземпляру. Обязательно скачайте ключ и сохраните его в надежном месте на вашем устройстве. Он понадобится нам позже.
-
Вы можете оставить все остальные настройки по умолчанию и нажать кнопку «Запустить экземпляр», чтобы запустить его.
Вот и все! Теперь у вас есть виртуальная машина, на которой вы можете развернуть свой сервер 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 и должны увидеть, что безопасное соединение установлено.
Заключение
Мы закончили! Это было довольно много работы, но наш сервер узла теперь работает, и все желающие могут отправлять на него запросы.
Я думаю, что умение развернуть сервер с нуля — очень ценный навык для веб-разработчика. Обучение этому помогло мне понять многие концепции, и теперь я имею гораздо более четкое представление о том, как все работает за кулисами. Надеюсь, это руководство было полезным и для вас.