it-swarm.com.ru

Как я могу автоматически запустить приложение node.js в Amazon Linux AMI на aws?

Существует ли краткое руководство, объясняющее, как запустить приложение при запуске и запуске экземпляра? Если бы это была одна из служб, установленных с помощью yum, то, я думаю, я мог бы использовать /sbin/chkconfig, чтобы добавить ее в службу. (Чтобы убедиться, это правильно?)

Тем не менее, я просто хочу запустить программу, которая не была установлена ​​через yum. Чтобы запустить программу node.js, мне придется запускать скрипт Sudo node app.js в домашнем каталоге всякий раз, когда система загружается.

Я не привык к Amazon Linux AMI, поэтому у меня нет проблем с поиском «правильного» способа автоматического запуска скрипта при каждой загрузке.

Есть ли элегантный способ сделать это?

38
user482594

Одним из способов является создание выскочки работы. Таким образом, ваше приложение запустится после загрузки Linux, автоматически перезапустится в случае сбоя, и вы можете запустить/остановить/перезапустить его с помощью Sudo start yourapp/Sudo stop yourapp/Sudo restart yourapp.

Вот начальные шаги:

1) Установите утилиту upstart (может быть предварительно установлена, если вы используете стандартный Amazon Linux AMI):

Sudo yum install upstart

Для Ubuntu:

Sudo apt-get install upstart

2) Создайте сценарий upstart для вашего приложения узла:

в /etc/init добавить файл yourappname.conf со следующими строками кода:

#!upstart
description "your app name"

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env NODE_ENV=development

# Warning: this runs node as root user, which is a security risk
# in many scenarios, but upstart-ing a process as a non-root user
# is outside the scope of this question
exec node /path_to_your_app/app.js >> /var/log/yourappname.log 2>&1

3) запустите приложение с помощью Sudo start yourappname

20
mvbl fst

Вы можете использовать forever-service для предоставления сценария узла в качестве службы и автоматического запуска во время загрузки. Следующие команды сделают все необходимое,

npm install -g forever-service
forever-service install test

Это обеспечит app.js в текущем каталоге как службу через вечность. Служба будет автоматически перезагружаться при каждом перезапуске системы. Также при остановке будет предпринята попытка изящной остановки. Этот скрипт также предоставляет скрипт logrotate .

URL Github: https://github.com/zapty/forever-service

На данный момент навсегда работает служба поддержки Amazon Linux, CentOS, Redhat для других дистрибутивов Linux, Mac и Windows.

ПРИМЕЧАНИЕ: я являюсь автором вечно-сервисного обслуживания.

8
arva

Быстрое решение для вас - запустить приложение с /etc/rc.local; просто добавьте свою команду туда.

Но если вы хотите пойти по элегантному пути, вам придется упаковать свое приложение в файл rpm, Иметь скрипт запуска, который идет в /etc/rc.d, чтобы вы могли использовать chkconfig в своем приложении, а затем установить rpm на свой пример.

Может быть это или это помочь. (или просто Google для "создания пакетов RPM")

7
Unknown

Вы можете создать скрипт, который может запускать и останавливать ваше приложение и помещать его в /etc/init.d; сделайте так, чтобы скрипт придерживался соглашений chkconfig (см. ниже), а затем используйте chkconfig, чтобы он запускался при запуске других служб.

Вы можете выбрать существующий скрипт из /etc/init.d для использования в качестве примера; эта статья описывает требования, которые в основном:

  • Исполняемый скрипт, который определяет необходимую оболочку (то есть #!/Bin/bash)
  • Комментарий в форме # chkconfig: где часто 345, startprio указывает, где в порядке запуска служб, а stopprio - где в порядке остановки служб. Обычно я выбираю подобный сервис, который уже существует, и использую его в качестве руководства для этих значений (то есть, если у вас есть веб-сервис, запускайте на тех же уровнях, что и httpd, с аналогичными приоритетами запуска и остановки).

После того, как ваш скрипт настроен, вы можете использовать 

 chkconfig --add yourscript 
 chkconfig yourscript on 

и тебе должно быть хорошо идти. (Некоторые дистрибутивы могут потребовать, чтобы вы вручную вставили символическую ссылку на скрипт в /etc/init.d/rc.d, но я верю, что ваш дистрибутив AWS сделает это за вас, когда вы включите скрипт.

5
TomG

Использовать Elastic Beanstalk :) Обеспечивает поддержку автоматического масштабирования, завершения SSL, сине-зеленых развертываний и т.д.

0
Tim Fulmer

Мой экземпляр Amazon Linux работает в Ubuntu, и я использовал systemd для его настройки.

Сначала вам нужно создать файл <servicename>.service. (в моем случае cloudyleela.service)

Sudo nano /lib/systemd/system/cloudyleela.service

Введите в этом файле следующее:

[Unit]
Description=cloudy leela
Documentation=http://documentation.domain.com
After=network.target

[Service]
Type=simple
TimeoutSec=0
User=ubuntu
ExecStart=/usr/bin/node /home/ubuntu/server.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

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

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

[email protected]:~$ Sudo systemctl daemon-reload
[email protected]:~$ Sudo systemctl start cloudyleela
[email protected]:~$ Sudo systemctl enable cloudyleela
Created symlink /etc/systemd/system/multi-user.target.wants/cloudyleela.service → /lib/systemd/system/cloudyleela.service.
[email protected]:~$

Отличный учебник по systemd для node.js доступен здесь .

Если вы запускаете веб-сервер:

Возможно, у вас возникнут некоторые проблемы с запуском вашего веб-сервера через порт 80. И самое простое решение - это на самом деле запустить ваш веб-сервер на другом порту (например, 4200), а затем перенаправить этот порт на порт 80. Вы можете сделать это с помощью следующей команды:

Sudo iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 4200

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

  1. ExecStartPre чтобы добавить переадресацию портов
  2. ExecStopPost для удаления переадресации портов
  3. PermissionStartOnly сделать это с силой Судо

Итак, как то так:

[Service]
...
PermissionsStartOnly=true
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200

Не забудьте перезагрузить и перезапустить ваш сервис:

[[email protected] system]$ Sudo systemctl daemon-reload
[[email protected] system]$ Sudo systemctl stop zbaduk.ishida
[[email protected] system]$ Sudo systemctl start zbaduk.ishida
[[email protected] system]$
0
bvdb