it-swarm.com.de

Wie kann ich in Amazon Linux AMI auf aws automatisch eine node.js-Anwendung starten?

Gibt es eine kurze Anleitung, um zu erklären, wie Sie eine Anwendung starten, wenn die Instanz gestartet wird und ausgeführt wird? Wenn es sich um einen der Services handelt, die über yum installiert wurden, kann ich /sbin/chkconfig verwenden, um ihn dem Service hinzuzufügen. (Um es sicher zu stellen, ist es richtig?)

Ich möchte jedoch nur das Programm ausführen, das nicht über yum installiert wurde. Um das node.js-Programm auszuführen, muss ich bei jedem Start des Systems das Skript Sudo node app.js im Home-Verzeichnis ausführen.

Ich bin nicht an Amazon Linux AMI gewöhnt, daher habe ich kaum Probleme, einen 'richtigen' Weg zu finden, Skripts bei jedem Start automatisch auszuführen.

Gibt es eine elegante Möglichkeit, dies zu tun?

38
user482594

Eine Möglichkeit besteht darin, einen Upstart-Job zu erstellen. Auf diese Weise wird Ihre App gestartet, sobald Linux geladen ist, wird bei einem Absturz automatisch neu gestartet und Sie können sie mit Sudo start yourapp/Sudo stop yourapp/Sudo restart yourapp starten/stoppen/neu starten.

Hier sind die ersten Schritte:

1) Installieren Sie das Upstart-Dienstprogramm (möglicherweise vorinstalliert, wenn Sie ein Standard-Amazon Linux-AMI verwenden):

Sudo yum install upstart

Für Ubuntu:

Sudo apt-get install upstart

2) Erstellen Sie ein Upstart-Skript für Ihre Knoten-App:

fügen Sie in /etc/init die Datei yourappname.conf mit den folgenden Codezeilen hinzu:

#!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) Starten Sie Ihre App mit Sudo start yourappname

20
mvbl fst

Sie können den Always-Service zum Bereitstellen von Knotenskript als Dienst verwenden und automatisch beim Booten starten. Die folgenden Befehle erledigen das Notwendige,

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

Dadurch wird app.js im aktuellen Verzeichnis als Service für immer bereitgestellt. Der Dienst wird automatisch neu gestartet, wenn das System neu gestartet wird. Auch wenn er angehalten wird, versucht er einen anmutigen Stopp. Dieses Skript stellt auch das logrotate - Skript bereit.

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

Für immer unterstützt forever-service Amazon Linux, CentOS, Redhat-Unterstützung für andere Linux-Distributoren, Mac und Windows sind in Arbeit.

HINWEIS: Ich bin der Autor des Ewigen Dienstes.

8
arva

Eine schnelle Lösung für Sie wäre, Ihre App über /etc/rc.local zu starten. Fügen Sie einfach Ihren Befehl dort hinzu.

Wenn Sie jedoch auf elegante Art und Weise vorgehen möchten, müssen Sie Ihre Anwendung in eine RPM-Datei packen. Sie haben ein Startskript für /etc/rc.d, damit Sie chkconfig in Ihrer App verwenden können Beispiel.

Vielleicht das oder das Hilfe. (oder einfach google für "RPM-Pakete erstellen")

7
Unknown

Sie können ein Skript erstellen, das Ihre App starten und stoppen und in /etc/init.d ablegen kann. Stellen Sie sicher, dass das Skript den Konventionen von chkconfig entspricht (unten), und legen Sie mit chkconfig fest, dass es gestartet wird, wenn andere Dienste gestartet werden.

Sie können ein vorhandenes Skript aus /etc/init.d auswählen, um es als Beispiel zu verwenden. Dieser Artikel beschreibt die Anforderungen, die im Wesentlichen lauten:

  • Ein ausführbares Skript, das die benötigte Shell identifiziert (d. H. #!/Bin/bash).
  • Ein Kommentar der Form # chkconfig: Wo oft 345 steht, gibt startprio an, wo in der Reihenfolge der Dienste begonnen werden soll, und stopprio ist wo in der Reihenfolge der Dienste zu stoppen. Im Allgemeinen wähle ich einen ähnlichen Dienst aus, der bereits vorhanden ist, und verwende diesen als Leitfaden für diese Werte (d. H., Wenn Sie einen webbezogenen Dienst haben, starten Sie auf demselben Niveau wie httpd mit ähnlichen Start- und Stopp-Prioritäten).

Sobald Ihr Skript eingerichtet ist, können Sie verwenden 

 chkconfig --add yourscript 
 chkconfig yourscript on 

und du solltest gut sein. (Bei einigen Distributionen ist es möglicherweise erforderlich, dass Sie manuell mit dem Skript auf /etc/init.d/rc.d verlinken, aber ich glaube, dass Ihre AWS-Distribution dies für Sie tun wird, wenn Sie das Skript aktivieren.

5
TomG

Verwenden Sie Elastic Beanstalk :) Unterstützt die automatische Skalierung, SSL-Terminierung, Blau/Grün-Bereitstellungen usw

0
Tim Fulmer

Meine Amazon Linux-Instanz läuft unter Ubuntu und ich habe sie mit systemd eingerichtet.

Zuerst müssen Sie eine <servicename>.service - Datei erstellen. (in meinem Fall cloudyleela.service)

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

Geben Sie Folgendes in diese Datei ein:

[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

In dieser Anwendung wird die Anwendung node gestartet. Sie benötigen hier einen vollständigen Pfad. Ich habe konfiguriert, dass die Anwendung einfach neu gestartet werden soll, wenn etwas schief geht. Die von Amazon verwendeten Instanzen haben standardmäßig keine Kennwörter für ihre Benutzer.

Laden Sie die Datei erneut von der Festplatte, und starten Sie den Dienst. Sie müssen es aktivieren, um es als Dienst zu aktivieren, der beim Start automatisch gestartet wird.

[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]:~$

Ein großartiges systemd für node.js Tutorial ist verfügbar hier .

Wenn Sie einen Webserver betreiben:

Wahrscheinlich haben Sie einige Probleme beim Betrieb Ihres Webservers auf Port 80. Die einfachste Lösung besteht darin, Ihren Webserver auf einem anderen Port (z. B. 4200) zu betreiben und diesen Port dann auf Port 80 umzuleiten. = Sie können dies mit dem folgenden Befehl erreichen:

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

Leider ist dies nicht persistent, so dass Sie es bei jedem Neustart Ihres Servers wiederholen müssen. Besser ist es, diesen Befehl auch in unser Service-Skript aufzunehmen:

  1. ExecStartPre, um die Portweiterleitung hinzuzufügen
  2. ExecStopPost, um die Portweiterleitung zu entfernen
  3. PermissionStartOnly, um dies mit Sudo-Power zu tun

So etwas in der Art:

[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

Vergessen Sie nicht, Ihren Dienst neu zu laden und neu zu starten:

[[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