NodeJS Сайт На EC2

Облачные сервисыNGINXDeploy

Как обычно получается в жизни, очевидные вещи часто неочевидны. И чтобы начать разработчику работать с AWS - нужно с чего-то начать. Например, с самого простого приметивного сайта на EC2. Cоздание и настройка пользователя для 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 [email protected]

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. Безусловно, сегодня все нормальные сайты, как минимум, закручены в контейнеры. Поэтому, если вы планируете пользоваться AWS и дальше - вам придётся изучить Docker с ECS - без этого никак. Но, для первого сайта - этого хватит.