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?
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
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.
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")
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:
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.
Use Elastic Beanstalk :) Assure la prise en charge de la mise à l'échelle automatique, de la terminaison SSL, des déploiements bleu/vert, etc.
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 .
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:
ExecStartPre
pour ajouter le transfert de portExecStopPost
pour supprimer la redirection de portPermissionStartOnly
faire cela avec le pouvoir SudoDonc, 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]$