NodeJS сайт на EC2

EC2DeployNGINX

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

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

Создаём инстанс в EC2

Переходим в сервис EC2 и в левом меню находим Instances.Справа вверху жмём на кнопку Launch instances. В опциях выбираем Amazon Linux. Вы можете брать и другой Linux, но я думаю, если уж вы решили пользоваться амазоном - нужно максимально использовать платформу. Можно выбрать ARM - я выбираю х86. Там есть тир t2.micro - он околобесплатный. Но мне кажется его для NodeJS маловато, поэтому я беру t2.small - суммы несущественные, можно смело брать.

После чего создаётся инстанс и мы получаем pem сертификат для коннекта к нашему серверу по ssh. Не потеряйте его, потому что, не знаю как сейчас - раньше такой сертификат перевыпустить было целой историей, то есть, невозможно. У каждого свои методы где хранить такие вещи - кто в хранилищах, кто на дисках - ваше дело. Берём этот сертификат и кладём в директорию ssl внутри нашего пользователя (я так делаю).

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

chmod 400 ssl/certs/your-website.pem

Теперь мы возвращаемся в браузер и находим наш публичный dns.

Копируем его и пробуем законнектиться по этому адресу через ssh, используя наш сертификат:

ssh -i ssl/certs/your-website.pem ec2-user@ec2-3-111-111-51.eu-central-1.compute.amazonaws.com

ec2-user перед собакой так и пишется - это ваш корневой пользователь в инстансе. хотя там есть отдельно root - он вам не понадобится. Законнектились? Выходите (написав exit) и идём дальше.

Подключаем домен

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

Заходим в сервис Route53 и регаем новую hosting zone для нашего домена. Каждая hosting zone будет стоить пол доллара в месяц. Там всё просто - забиваем домен, она создаётся. Попадаем в нашу зареганную зону. Если домен регали не на aws - нужно прописать адреса NS-ов.


Копируем их все и закидываем в NS-записи на сайте вашего регистратора.

Открываем порты

Чтобы открыть порты на сервере, нам нужно открыть их в Security Group'ах, подключеных к нашему инстансу. В общем, переходим в EC2 и в левом меню находим Security Groups. Создаём нашу группу. Нас интересуют Inbound Rules. Откроем http и https порты на вход.


Осталось добавить это правило к уже существующим на инстансе.

Добавляем нашу новую Security Group'пу к уже подключенным. В теории там у нас будет группа для ssh подключения. Если удалите её - не подключитесь по ssh, пока не созданите новую.

Статический IP и WWW

Последним гвоздём станет подключение статического IP и переход на www. И, если делать переход с www - дело, сугубо, вкуса. То наличие статического адреса для вебсайта сегодня обязательно. Это не бесплатно - что делать. В левом меню EC2 находим Elastic IPs - это они и есть. В настройках указываем наш EC2 инстанс. Если вы всё делали правильно - публичный IP у инстанса должен смениться на ваш статический.

Копируем его и идём в Route53. Теперь нам нужно сделать две вещи.

  1. Устанавливаем наш IP. Выбираем нашу запись типа A и вставляем в неё наш IP - шник
  2. Создаём запись CNAME с www, которая редиректит на ваш домен без www

В итоге у нас получается что-то такое. Мы закончили с AWS - переходим к настройкам сервера.

Настройка сервера

Для начала запустим наш сайт. Для этого нам понадобятся git, NodeJs и pm2. Установим их.

sudo yum install git -y

В гайдах рекомендуют часто устанавливать nodejs из snap'a или из через nvm - по мне это излишне.

sudo yum install -y nodejs

Скачиваем гитом наш сайт и устанавливаем зависимости:

npm install --only=production

Для запуска приложения я рекомендую использовать pm2. В нём очень удобные мониторы чтобы смотреть статусы приложения

npm i -g pm2

Если вдруг где-то у вас нехватает прав - посмотрите официальное руководство npm.

Запускаем сайт и проверяем что он запустился через curl

curl http://localhost:3000

Завершающий шаг - устанавливаем и настраиваем NGINX. Кто-то пользуется Apachi - мне как-то он со времён php казался неоправданно сложным.

sudo amazon-linux-extras install nginx1

Идём в /etc/nginx и создаём там директорию для конфигов сайта

cd /etc/nginx
sudo mkdir sites-available

Создаём конфиг - открываем для редактирования файл в nano или vim - мне роднее vim.

cd sites-available
sudo vim my-website.ru.conf

Закидываем туда простой конфиг на 80 порт с редиректом на www

server {
    listen 80;
    listen [::]:80;
    server_name  your-website.ru;
    return       301 http://www.your-website.ru$request_uri;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  www.your-website.ru;
    location / {
               proxy_pass http://localhost:3000;
               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;
       }
}

Не забываем в proxy_pass подправить порт под нужный нам. Сохраняем и закидываем конфиг в активные.

cd ..
sudo mkdir sites-enibled
sudo ln -s /etc/nginx/sites-available/my-website.ru.conf /etc/nginx/sites-enabled/my-website.ru.conf

Включаем папочку. Для этого нам нужно подправить базовый конфиг nginx.

sudo vim /etc/nginx/nginx.conf

Инклюдим все конфиги из sites-enabled и выключаем дефолтный сайт.

Рестартуем nginx и идём на наш домен с http вначале (http://your-website.ru). Если у вас всё настроено правильно вы увидите ваш сайт в браузере.

Добавление https

Самый простой способ перекинуть ваш домен в https - использовать либу для nginx с автоматической регистрацией. Установим её.

sudo yum install -y python-certbot-nginx

Пропишем наш домен.

sudo certbot --nginx -d your-website.ru -d www.your-website.ru
sudo systemctl restart nginx

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

Последним штрихом будет утвердить в вебе что у вашего сайта есть годный ssl сертификат. Оно может и само пройдёт - но я всё же думаю надо это делать самостоятельно. Копируем наш домен и забиваем его в SSL Server Test.

Заключение

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