Ich habe eine Node.js-App geschrieben und möchte sie auf einer unserer Produktionsmaschinen zum Laufen bringen. Dies scheint eine ziemlich häufige Anfrage zu sein, aber ich kann keine adäquate Lösung finden. Gibt es keine etablierten Lösungen für die Bereitstellung von Node.js-Apps für die Produktion?
Die App ist einfach (<100 LOC), muss jedoch sehr effizient und zuverlässig sein und kann jahrelang ohne Neustart kontinuierlich ausgeführt werden. Es wird auf einer großen Site mit Dutzenden von Verbindungen pro Sekunde ausgeführt. (Die App wird nicht als Webserver verwendet, sondern verfügt nur über eine JSON-API.)
Hier sind die Ansätze, über die ich nachgedacht habe, bei denen ich mir jedoch noch nicht sicher bin:
Verwenden eines Frameworks (z. B. Express)
Da die App eine hohe Leistung haben muss und so einfach ist, möchte ich das Hinzufügen von Aufblähungen in Form eines Frameworks vermeiden.
Starten des Servers mit nohup
Das Hauptproblem hierbei ist die Ausnahmebehandlung. Wir möchten (offensichtlich) nicht, dass der gesamte Server aufgrund einer Ausnahme abstürzt. Soweit ich weiß, try {} catch {}
hilft es nicht , die gesamte App in eine Schleife zu packen, da der Javascript-Interpreter nach einer Ausnahme in einem unvorhersehbaren Zustand bleibt. Ist das korrekt?
Mit so etwas wie Forever
Ich habe Forever auf einem unserer FreeBSD-Computer installiert und es war sehr fehlerhaft. Es kam zu endlosen Prozessen, die von Forever nicht getötet werden konnten. Ich musste laufen kill -9
, um meine Maschine zurückzubekommen, und ich bin mir nicht sicher, ob ich eine Produktions-App auf Forever ausführen soll . Es scheint auch, dass Upstart (ähnliches Tool, aber allgemeiner) unter FreeBSD nicht ausgeführt werden kann.
Gehostete Lösungen (z. B. Heroku, Rackspace, Amazon EC2 usw.)
Dies ist wahrscheinlich die einfachste Lösung, aber wir haben bereits die seriöse Hardware für den Rest unserer Webserver. Aus finanziellen Gründen macht es keinen Sinn.
Sicherlich muss es dafür eine etablierte Lösung geben? Vermisse ich etwas
quelle
Forever
sollte nicht abgezinst werden, da es in diesem einen Fall über zwei Jahre und zahlreiche Commits vor gescheitert ist. Ich habe es in den letzten Monaten erfolgreich laufen lassen.Antworten:
quelle
Siehe Hosting Node Apps .
quelle
Versuchen Sie es mit pm2. Es ist eine einfache und intuitive CLI, die über NPM installiert werden kann. Starten Sie einfach Ihre Anwendung mit PM2 und Ihre Anwendung ist bereit, eine Menge Verkehr zu verarbeiten
PM2 Offical Link
So richten Sie eine Knoten-js-Anwendung für die Produktion mit pm2 ein
quelle
Ich denke, hier gibt es drei Fragen.
Frage 0: "Soll ich ein Framework für meine Knoten-App verwenden?"
Frage 1: "Wie führe ich Knotenserver auf Produktionsmaschinen aus?"
Frage 2: "Wie stelle ich Knoten-Apps für die Produktion bereit?"
Bei Frage 1 gefällt mir Cluster sehr gut (obwohl in der neuesten Node-Version so etwas integriert ist, können Sie dies überprüfen). Ich hatte gute Erfolge mit Monit / Upstart, um Ereignisse auf Betriebssystemebene zu überwachen und sicherzustellen, dass Ihre Server in gutem Zustand sind. (Dies war die Überwachung von N Clustern von Ruby Thin-Servern, aber dasselbe).
Abhängig vom Datenverkehr möchten Sie möglicherweise Cluster auf mehreren Computern ausführen und dann einen Load Balancer davor stellen. Dies hängt von Ihrem Datenverkehr ab, davon, wie lange Anforderungen abgeschlossen sind / wie lange Sie die Ereignisschleife blockieren und wie viele Prozessoren / Knoteninstanzen Sie pro Computer starten.
Ein Framework bietet Ihnen eine bessere Fehlerbehandlung und fängt Fehler ab, die normale node.js-Apps beenden würden. Wenn Sie dies ohne Framework tun, lesen Sie die Fehlerbehandlung in node.js.
Bei Frage 2 glaube ich nicht, dass die Knotengemeinschaft noch einen guten Bereitstellungsstandard hat. Sie können versuchen, Rubys Capistrano-Tool zu verwenden (und hier ist ein Blogeintrag über die Bereitstellung von Clustern mit Capinstrano ).
Das Schlechte an Capistrano ist, dass einige Annahmen getroffen werden, die möglicherweise nicht zutreffen (z. B. dass Sie ein Rails-Projekt bereitstellen), sodass Sie möglicherweise häufig mit dem Framework kämpfen.
Meine Goto-Bereitstellungslösung im Allgemeinen ist das Fabric- Tool von Python , mit dem Sie Bereitstellungstools erhalten und das tun können, was Sie tun müssen.
Eine weitere Bereitstellungsoption ist "die Cloud" mit Dingen wie Nodester : Lassen Sie sie sich darum kümmern.
quelle
Möglicherweise erhalten Sie bei ServerFault bessere Antworten, aber es gibt eine Beschreibung der Benutzererfahrung hier mit
supervisord
. Sie müssen eine Art Prozessüberwachung verwenden, um dennode
Prozess am Leben zu erhalten, und eine weitere häufige Empfehlung scheint darin zu bestehen, Proxy-Verbindungen zumnode
Prozess irgendwie umzukehren . Ich würde wahrscheinlich dafür stimmennginx
(auf diese Weise können Sienginx
die Protokollierung, Authentifizierung oder andere übergeordnete HTTP-Funktionen verwalten, die Sie benötigen, anstatt sie irgendwie in Knoten zu backen), aber der oben genannte Artikel erwähnthaproxy
in den Kommentaren hier und da welche kann leichter sein. Ihre Wahl des Reverse-Proxys hängt wahrscheinlich weitgehend davon ab, ob Sie WebSocket-Unterstützung benötigen oder nicht.Ich bin mir nicht sicher, ob es noch einen "Standard" -Workflow für den Knoten gibt. Es ist nicht ganz so ausgereift wie Rails, das eine Vielzahl von Möglichkeiten bietet, eine Webanwendung am Laufen zu halten.
quelle
Die Jungs von Cloudkick haben eine hervorragende Lösung dafür geschrieben. Es heißt
Cast
, http://cast-project.org/ .Installieren Sie cast auf Ihrem Server und auf Ihrer Workstation. Sie starten den Cast-Agent auf dem Server und lassen Ihre Workstation mit der Cast-Instanz des Servers signieren. Sie können dann "Bundles" erstellen, sie auf den Server hochladen, daraus erstellen / aktualisieren / zerstören sowie Ihre Instanzen starten / stoppen. Cast startet Ihre Dienste automatisch neu, wenn sie abstürzen. Sie können stdout / strerr auch remote verfolgen sowie eine Liste der ausgeführten Instanzen und PIDs abrufen und Ihre Instanzen / Server von Ihrer Workstation aus verwalten (kein SSHing erforderlich). Die Dokumente sind etwas veraltet, aber die Ergebnisse sind ein wenig zusätzliche Arbeit wert. Alle Interaktionen / Befehle erfolgen über HTTPS und eine RESTful-API.
Zuvor habe ich alle Upgrades von Hand mit SCP / SSH durchgeführt. Wir müssen
supervise
weitermachen. Wir haben nicht zurückgeschaut.quelle