web-dev-qa-db-fra.com

Comment démarrer automatiquement une application node.js dans Amazon Linux AMI sur aws?

Existe-t-il un bref guide expliquant comment démarrer une application lorsque l'instance démarre et s'exécute? S'il s'agissait de l'un des services installés via yum, je suppose que je peux utiliser /sbin/chkconfig pour l'ajouter au service. (Pour être sûr, est-ce correct?)

Cependant, je veux juste exécuter le programme qui n’a pas été installé avec yum. Pour exécuter le programme node.js, je dois exécuter le script Sudo node app.js dans le répertoire de base à chaque démarrage du système.

Je ne suis pas habitué à l’AMI d’Amazon Linux et j’ai donc peu de difficulté à trouver le «bon» moyen d’exécuter un script automatiquement à chaque démarrage.

Y a-t-il une manière élégante de faire ceci?

38
user482594

Une façon est de créer un travail qui commence. Ainsi, votre application démarrera une fois Linux chargée, redémarrera automatiquement si elle se bloque et vous pourrez la démarrer/l’arrêter/la redémarrer avec Sudo start yourapp/Sudo stop yourapp/Sudo restart yourapp.

Voici les premières étapes:

1) Utilitaire d'installation upstart (peut être pré-installé si vous utilisez une AMI Amazon Linux standard):

Sudo yum install upstart

Pour Ubuntu:

Sudo apt-get install upstart

2) Créez un script de démarrage pour votre application de nœud:

dans /etc/init, ajoutez le fichier yourappname.conf avec les lignes de code suivantes:

#!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) démarrez votre application par Sudo start yourappname

20
mvbl fst

Vous pouvez utiliser forever-service pour le script de noeud d'approvisionnement en tant que service et démarrer automatiquement pendant les démarrages. Les commandes suivantes feront le nécessaire,

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

Cela mettra en service app.js dans le répertoire actuel en tant que service via forever. Le service redémarre automatiquement à chaque redémarrage du système. De plus, une fois arrêté, il tentera un arrêt gracieux. Ce script contient également le script logrotate .

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

À partir de maintenant, Forever-Service prend en charge les services Amazon Linux, CentOS et Redhat, ainsi que les autres distributions Linux, Mac et Windows.

NOTE: Je suis l'auteur de forever-service.

8
arva

Une solution rapide pour vous serait de démarrer votre application à partir de /etc/rc.local; Ajoutez simplement votre commande ici.

Mais si vous voulez aller de manière élégante, vous devez conditionner votre application dans un fichier rpm. Vous devez disposer d'un script de démarrage dans /etc/rc.d pour pouvoir utiliser chkconfig sur votre application, puis installer le rpm sur votre ordinateur. exemple.

Peut-être ceci ou ceci help. (ou simplement google pour "créer des paquets rpm")

7
Unknown

Vous pouvez créer un script qui peut démarrer et arrêter votre application et le placer dans /etc/init.d; Faites en sorte que le script respecte les conventions de chkconfig (ci-dessous), puis utilisez chkconfig pour le configurer de manière à ce qu'il soit démarré au démarrage d'autres services.

Vous pouvez choisir un script existant dans /etc/init.d à utiliser comme exemple; cet article décrit les exigences, qui sont essentiellement:

  • Un script exécutable qui identifie le shell nécessaire (par exemple, #!/Bin/bash)
  • Un commentaire de la forme # chkconfig: où est souvent 345, startprio indique où, dans l’ordre des services, commence et stopprio, où, dans l’ordre des services. Je choisis généralement un service similaire qui existe déjà et l’utilise comme guide pour ces valeurs (c’est-à-dire, si vous avez un service Web, commencez au même niveau que httpd, avec des priorités de démarrage et d’arrêt similaires).

Une fois votre script configuré, vous pouvez utiliser 

 chkconfig --add yourscript 
 chkconfig yourscript on 

et vous devriez être prêt à partir. (Certaines distributions peuvent vous demander de faire manuellement un lien symbolique vers le script vers /etc/init.d/rc.d, mais je pense que votre distribution AWS le fera pour vous lorsque vous activez le script.

5
TomG

Use Elastic Beanstalk :) Assure la prise en charge de la mise à l'échelle automatique, de la terminaison SSL, des déploiements bleu/vert, etc.

0
Tim Fulmer

Mon instance Amazon Linux s'exécute sur Ubuntu et j'ai utilisé systemd pour la configurer.

Vous devez d’abord créer un fichier <servicename>.service. (dans mon cas cloudyleela.service)

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

Tapez ce qui suit dans ce fichier:

[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

Dans cette application, l'application node est démarrée. Vous aurez besoin d'un chemin complet ici. J'ai configuré que l'application devrait simplement redémarrer si quelque chose ne va pas. Les instances utilisées par Amazon n'ont pas de mot de passe pour leurs utilisateurs par défaut.

Rechargez le fichier à partir du disque, puis vous pourrez démarrer votre service. Vous devez l'activer pour le rendre actif en tant que service, qui se lance automatiquement au démarrage.

ubuntu@ip-172-31-21-195:~$ Sudo systemctl daemon-reload
ubuntu@ip-172-31-21-195:~$ Sudo systemctl start cloudyleela
ubuntu@ip-172-31-21-195:~$ Sudo systemctl enable cloudyleela
Created symlink /etc/systemd/system/multi-user.target.wants/cloudyleela.service → /lib/systemd/system/cloudyleela.service.
ubuntu@ip-172-31-21-195:~$

Un excellent tutoriel systemd pour node.js est disponible ici .

Si vous utilisez un serveur Web:

Vous rencontrerez probablement des problèmes d’exploitation de votre serveur Web sur le port 80. Et la solution la plus simple consiste à exécuter votre serveur Web sur un autre port (4200, par exemple), puis à le rediriger vers le port 80. Vous pouvez le faire. avec la commande suivante:

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

Malheureusement, ceci est non persistant, vous devez donc le répéter chaque fois que votre serveur redémarre. Une meilleure approche consiste à inclure également cette commande dans notre script de service:

  1. ExecStartPre pour ajouter le transfert de port
  2. ExecStopPost pour supprimer la redirection de port
  3. PermissionStartOnly faire cela avec le pouvoir Sudo

Donc, quelque chose comme ça:

[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

N'oubliez pas de recharger et de redémarrer votre service:

[ec2-user@ip-172-31-39-212 system]$ Sudo systemctl daemon-reload
[ec2-user@ip-172-31-39-212 system]$ Sudo systemctl stop zbaduk.ishida
[ec2-user@ip-172-31-39-212 system]$ Sudo systemctl start zbaduk.ishida
[ec2-user@ip-172-31-39-212 system]$
0
bvdb