Bereitstellen eines Node.js-Produktionsservers [geschlossen]

75

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

David Chouinard
quelle
upstart ist ein Ersatz für sysvinit auf freebsd.
Chovy
3
Für die 2014er Menge, die diese SO liest. Foreversollte 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.
Essen Sie bei Joes
7
Für das Publikum 2015, das dieses SO liest. Verwenden Sie einfach PM2 anstelle von Forever.
Nikola

Antworten:

41
  • Sie sollten wirklich wirklich ein Framework verwenden (ich empfehle etwas wie Express, da es kampferprobt wurde), es sei denn, Sie möchten Sitzungen, Cookies, Middleware usw. selbst bearbeiten. Express ist wirklich leicht.
  • Starten des Servers mit nohup: Sie sollten dies nicht tun, sondern nur mit dem regulären Befehl "node". Außerdem umschließt Express die Routen mit einem Try-Catch, damit Ihr Server auf einer Route nicht abstürzt. Wenn Ihr Server jedoch ein ernstes Problem hat, sollten Sie keinen Neustart befürchten (außerdem stirbt nur einer, wenn Sie mindestens 2-3 Prozesse haben, so dass mindestens 1-2 übrig bleiben und der Benutzer gewinnt. ' nichts fühlen).
  • Für die Überwachung bevorzuge ich persönlich etwas mehr auf Betriebssystemebene wie Upstart und Monit .
  • Hosting-Lösung: Da Sie bereits über eigene Hardware verfügen, müssen Sie kein Geld in etwas anderes investieren. Verwenden Sie einfach einen Load-Balancer (möglicherweise Nginx oder Node-http-Proxy), um Inhalte zu vertreten.
Alessioalex
quelle
15

Siehe Hosting Node Apps .

Dieses Tutorial führt Sie durch die Einrichtung eines Servers, auf dem node.js-Apps für serverseitige JavaScript-Anwendungen gehostet werden können. Derzeit beschränken sich die Hosting-Optionen von node.js darauf, Node-Daemon-Prozesse auszuführen, die mit einem Webserver kommunizieren. Die meisten Webserver können Proxy-Verbindungen zu einem anderen Port herstellen, sodass Sie dazu Apache oder Nginx verwenden können.

Hilfsmethode
quelle
2
Die Verbindung ist unterbrochen.
Jorge Gil
5

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.

RyanWilcox
quelle
2

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 den nodeProzess am Leben zu erhalten, und eine weitere häufige Empfehlung scheint darin zu bestehen, Proxy-Verbindungen zum nodeProzess irgendwie umzukehren . Ich würde wahrscheinlich dafür stimmen nginx(auf diese Weise können Sie nginxdie 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ähnt haproxyin 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.

Wyatt Anderson
quelle
0

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 superviseweitermachen. Wir haben nicht zurückgeschaut.

Ryan Olds
quelle
1
Es ist tot, Jim! Die Website ist jetzt voller SEO-Müll und Google findet nichts Interessantes für "node.js cast"
Sergey
Ja, es ist aufgegeben. Wir pflegen eine Inhouse-Version atm. Das Repo finden Sie unter: github.com/cloudkick/cast
Ryan Olds