Как инженер-программист, я часто забываю сложности того, как развернут мой код. Когда я запускаю код, который я пишу, как правило, это делается в моей местной среде разработки, а затем я нажимаю свой код в репозиторий, где благодаря непрерывной магии развертывания мой код становится доступным для моих конечных пользователей.
Пока я пожинаю много преимуществ от этой сложности, я часто забываю, почему именно там есть, и когда все не работает, я просто раздражен сложностью.
В этой статье я собрал очень минимальное Node.js и экспресс-приложение и разверните его вручную на экземпляр AWS. Целью данного упражнения является оценка преимуществ и недостатков для выполнения моего развертывания.
ПРИМЕЧАНИЕ. Стоит отметить минимальные, я имею в виду наименьшее количество произведений, не обязательно наименьшее количество шагов. Что-то вроде Хероку, скорее всего, уйдет вас и работает намного быстрее.
Приложение, которое я имею в виду, это простой «Hello World!» Экспресс-приложение. Сначала я бегу несколько команд в Bash, чтобы настроить мою среду.
mkdir express_hello_world cd express_hello_world npm init -y npm install express
Тогда я создаю Server.js
со следующим кодом JavaScript.
const express = require("express") const app = express() app.get("/", function(req, res) { res.send("Hello World") }) app.listen(3000)
Теперь, если я бегу свой код с Node Server.js
Я должен быть в состоянии пойти в http://localhost: 3000/ И посмотрите сообщение «Hello World» в моем браузере.
Здорово! Теперь совершайте и нажимайте, и двигайтесь на следующую вещь правильно? О, подожди, мы развертываем вручную, мы получили некоторую работу.
Нам нужен компьютер какой-то, чтобы запустить наш код в Интернете. Тем более что мой ноутбук не онлайн 24/7, и мы бы не хотели бы, чтобы кто-то не сможет получить доступ к нашему приветствию. Я направляюсь к AWS Console Отказ
- Нажмите на «EC2»
- Нажмите на «Запуск сервера»
- Выберите «Amazon Linux 2 AMI»
- Нажмите «Обзор и запустить»
- Нажмите «Запуск»
- В раскрывающемся списке выберите «Создать новую ключевую пару»
- Введите «Express_Hello_World» как мое «имя ключа»
- Нажмите «Скачать ключевую пару»
- Нажмите «Запустить экземпляры»
Whaw! Это было несколько шагов, большинство из которых я не на самом деле не потратил время, чтобы оценить лучшие варианты, но теперь у нас есть какой-то сервер «по умолчанию» для запуска нашего кода. Тем не менее, нам все еще нужно установить Node.js на сервере и загрузите наше приложение «Hello World» на сервер, а затем убедитесь, что он работает.
Пара ключей мы загрузили файл «PEM», который является закрытым ключом. Мы можем использовать эту клавишу для подключения к серверу через SSH-клиент. Нам также нужен публичный IP-адрес нашего созданного нашего сервера AWS. Из «Приборной панели EC2» нажмите «Экземпляры» на левой боковой панели и найдите столбец «Public IP-адрес IPv4», который имеет IP-адрес для экземпляра, который мы только что создали.
Теперь мы можем подключиться к серверу.
mkdir -p ~/Documents/AWS/keys/express_hello_world/ cd ~/Documents/AWS/keys/express_hello_world/ cp ~/Downloads/express_hello_world.pem ./ chmod 400 express_hello_world.pem ssh -i "express_hello_world.pem" ec2-user@
Теперь вы должны быть в приглашении Bash на экземпляре AWS EC2.
Примечание. Если вы используете Windows, вы, вероятно, должны следовать инструкциям для Подключение к вашему экземпляру Linux из Windows с помощью PUTTY . Однако вы можете использовать «подсистему Windows из Linux» (WSL). Если вы используете WSL, убедитесь, что вы положите express_hello_world.pem.pem. в папке WSL или chmod 400 express_hello_world.pem. не будет работать.
На главной странице Node.js Инструкции по установке для менеджера пакета Yum, который является то, что использует наш экземпляр сервера, следующим образом.
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash - sudo yum -y install nodejs
Вы можете ввести Узел --version
Чтобы проверить, установлен ли он и вы находитесь в правильной версии. Текущая версия LTS была 8.11.4, когда эта статья была написана. Все больше, чем это должно работать нормально.
Мы создадим пользователя для запуска нашего приложения. Это мешает нам беспокоиться о том, что наше приложение может сделать как root, или даже потенциально со способностями Sudo, как EC2-пользователь
Отказ
sudo useradd express_hello_world
Выйдите из нашей текущей сессии SSH, набрав Выход
Отказ Найдите каталог, где мы изначально поставили наши Server.js
и package.json
файлы. Мы скопируем этот каталог для EC2-пользователь
Домашний каталог на нашем экземпляре сервера EC2.
После того, как мы достигнем этого, мы хотим установить разрешения, поэтому владелец — это Express_hello_world
Пользователь, который мы только что создали, и переместите приложение к Express_helo_world
Домашний каталог.
rm -rf/node_modules scp -r -i "express_hello_world.pem" \ \ ec2-user@ :express_hello_world_app ssh -i "express_hello_world.pem" ec2-user@ sudo chmod 600 ./express_hello_world_app/* sudo chown -R express_hello_world:express_hello_world ./express_hello_world_app sudo mv ./express_hello_world_app /home/express_hello_world/express_hello_world_app
Примечание. Для пользователей Windows она, вероятно, имеет наибольшее значение для использования программы, как Filezilla Чтобы скопировать файлы на сервер. Хотя с WSL вы можете использовать ущерб Метод описан здесь. Опять же убедитесь, что ваш закрытый ключ находится в каталоге WSL с правильными разрешениями (400).
Это хорошее время, чтобы сделать чек здравомыслия. Мы должны иметь возможность запускать приложение из Express_hello_world
пользователь, и использовать Curl
Чтобы получить сообщение «Hello World».
Стать Express_hello_world
Пользователь и установите экспресс-зависимость. Мы также проверяем здесь, чтобы убедиться, что мы получим «соединение отказано», поскольку сервер не должен работать.
sudo su - express_hello_world cd ./express_hello_world_app npm install curl localhost:3000 # Expected output "Connection Refused"
Теперь мы должны быть в состоянии запустить сервер и получить отклик «Hello World».
node server.js & SERVER_PID=$! curl localhost:3000 # Expected output "Hello World"
После того, как мы проверили, мы получим наш ответ «Hello World». Убейте сервер и убедитесь, что мы больше не принимаем соединения.
kill $SERVER_PID curl localhost:3000 # Expected output "Connection Refused"
Наконец-то введите Выход
вернуться к EC2-пользователь
Пользователь.
Поскольку мы запускаем наше приложение в качестве непредвзятого пользователя, мы не можем разместить его на порту 80 (или любой порт ниже 1024). Однако мы можем создать правило брандмауэра, чтобы переслать этот порт в порт, на котором мы ходили.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3000
Нам также необходимо настроить правила безопасности AWS, чтобы разрешить трафик на порту 80. От приборной панели EC2. Нажмите на экземпляры в левой боковой панели. Щелкните правой кнопкой мыши на экземпляре, который мы создали, перейдите в «Сетевые», затем «Изменить группы безопасности». Посмотрите на «ID Group Security», которые мы выбрали, и помните его. Нажмите «Отмена».
На левой боковой панели щелкните «Группы безопасности». Щелкните правой кнопкой мыши на строке с «ID группы безопасности», которые мы нашли на последнем шаге. И нажмите «Изменить входящие правила». Нажмите «Добавить правило» и из падения, выберите «HTTP». Затем нажмите «Сохранить».
В вашем браузере попробуйте пойти на http://
Продолжайте и запустите сервер снова. Запустите следующие команды.
sudo su - express_hello_world cd ./express_hello_world_app node server.js & SERVER_PID=$!
Теперь, если перейдем к предыдущему URL, мы должны получить сообщение «Hello World» в браузере.
Потрясающий! Теперь мы живем!
Чтобы выключить сервер, мы можем убить приложение, как мы проводили в прошлый раз.
kill $SERVER_PID exit # To exit the express_hello_world user prompt
У нас есть рабочий сервер, но было бы намного лучше, если у нас не было процесса сервера, привязанного к нашей текущей сессии SSH. Мы можем использовать системный процесс для этого. Он также будет справиться с уверенностью, что сервер перезагружен, если он не удается, и автоматически запущен, когда сервер загружается.
Создать файл Express_hello_world.service
в /etc/systemd/system/
Отказ
sudo vim /etc/systemd/system/express_hello_world.service
Добавьте следующее в этот файл. Это настройки для нашего демона процесса. Вы можете контролировать такие вещи, как команда, которую мы используем для начала процесса с помощью «EXPSTART». Пользователь/группа, какие переменные среды устанавливаются и текущий рабочий каталог.
[Unit] Description=Express Hello World Application After=network.target [Service] ExecStart=/usr/bin/node server.js Restart=always User=express_hello_world Group=express_hello_world Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/home/express_hello_world/express_hello_world_app [Install] WantedBy=multi-user.target
Начать нашу работу, мы используем SystemCTL
Отказ Мы можем использовать подкоманд состояния, чтобы проверить этот статус нашего процесса демона тоже.
sudo systemctl start express_hello_world.service sudo systemctl status express_hello_world.service
Отладка
После запуска состояния мы должны увидеть «Active: Active (работает)». Если вы не видите это, что-то очевидно пошло не так. Использовать Sudo DesignCtl --Unit Express_Hello_world.service
Чтобы проверить журнал ошибок Узел Service.js
команда.
Одной из вероятных причин неспособности работы является порт 3000. Это может произойти, когда вы забыли убить сервер в одной из контрольно-пропускных пунктов (это случилось со мной, ха-ха). Сделать PS Aux |. Узел GREP
и найдите процесс, который все еще работает, обратите внимание, что это PID, затем сделай Sudo Kill
Отказ После этого процесс демона должен начать без проблем.
Перезагрузка
Наконец, чтобы убедиться, что приложение запускается, когда сервер загружен, запустите команду
sudo systemctl enable express_hello_world.service
Упорные iptables между перезагрузками
Если вы перезагрузите сейчас, правило iPTable, которое мы определены ранее, не будут восстановлены при загрузке. Мы также можем создать системную службу, которая делает это. Создайте файл /etc/systemd/service/express_hello_world_iptabables.service
и поместите следующую систему конфигурации системы.
[Unit] Description=Forward port 80 to port 3000 [Service] Type=oneshot ExecStart=/bin/sh -c "iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3000" ExecStop=/bin/sh -c "iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to 3000" RemainAfterExit=yes [Install] WantedBy=multi-user.target
Затем удалите правило, которое мы уже создали, и начните службу, которую мы только что определили (это воссоздает правило).
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to 3000 sudo systemctl start express_hello_world_iptables.service sudo systemctl enable express_hello_world_iptables.service
ПРИМЕЧАНИЕ. Похоже, что есть лучший способ обрабатывать эти вещи IPTables, но я не мог найти ничего, что ощущалось очень минимально. Это не похоже на то, что должно быть очень сложным.
В вашем браузере перейдите к http://
Запустите следующую команду, чтобы остановить наше приложение.
sudo systemctl stop express_hello_world.service
И обновить браузер, чтобы убедиться, что сервер больше не отвечает.
Теперь перезагрузите сервер.
sudo reboot
Подождите, пока сервер вернется, и проверьте веб-сайт. Мы должны получить сообщение «Hello World» снова.
Предполагая, что все прошло гладко, у нас теперь есть функциональный сервер, принимающий наше приложение Nodejs!
Это было много шагов, чтобы все настроить. Однако большая часть этого может быть легко автоматизирована. Даже предоставление услуга AWS может быть автоматизирована через Интерфейс командной строки AWS Отказ
Повторно развернуть
Чтобы развернуть новую версию нашего приложения, нам просто нужно будет скопировать файлы на наш сервер и перезапустить демон. Еще один шаг, который должен быть довольно легко автоматизировать.
Недостатки
Приложение работает точно так, как мы его устанавливаем. Чтобы что-нибудь изменить, мы действительно должны знать Linux очень хорошо. Я могу справиться с Googling Basic Commands, но кажется, что некоторые простые вещи могут быть боль, например:
- Настройте HTTPS (на Heroku это один щелчок настроек в значительной степени)
- Перейти к другому сервису. (С чем-то вроде докера Это может быть проще, много того, что я так я думаю, был специфичен для Amazon Linux 2).
- Масштабирование. (Что-то вроде докера позволит вам легко запустить больше экземпляров моего приложения).
iptables.
Мое понимание заключается в том, что iptables устарели, но как новичок в администрации системы Linux, неясно для меня, какие доступные замены. Многие из информации, которую я мог бы найти, ссылаясь на команды, которые просто не существовали в моей системе.
Следующие шаги
Я мог бы попытаться написать несколько сценариев, которые автоматизируют этот процесс, чтобы увидеть, насколько сложно развернуть разные приложения на разных серверах. У меня, безусловно, у меня есть жесткие ценности в моем системе, что мне придется иметь дело.
Все во всем было весело, чтобы получить это и бежать.
Оригинал: «https://dev.to/zrbecker/a-minimal-nodejs-and-express-server-setup-and-deployment-3noe»