NodeJS Anwendung in Webhosting 4000 stoppen?

  • Hallo zusammen,


    ich nutze das Webhosting 4000 und habe dort zwei Subdomains: app.foo.de und api.foo.de

    Unter app.foo.de wird das Frontend bereitgestellt (Vue SPA). Unter api.foo.de ist das Backend erreichbar. Dabei handelt es sich um eine Node Anwendung (NestJS), die nur auf localhost auf einem von mir definierten Port zuhört. Anfragen an die Subdomain werden durch Apache an localhost an den richtigen Port weitergeleitet.


    Ich habe jetzt ein ähnliches Problem wie hier in dieser Frage geschildert. Das Setup an sich funktioniert, Frontend und Backend sind korrekt erreichbar. Allerdings musste ich auf dem Weg dorthin ein wenig testen und habe mehrfach die Node Anwendung über npm start gestartet. Ich musste dafür bei jedem weiteren Versuch den Port ändern, da der vorherige bereits unter Benutzung war ('Error: address already in use'). Blöderweise läuft die Anwendung jetzt mehrfach in verschiedenen Versionen unter verschiedenen Ports, und ich finde keinen Weg, diese zu stoppen. "App neu starten" oder NodeJS deaktivieren und neu aktivieren im WCP funktioniert leider nicht.


    Ich habe auch versucht, das Problem über SSH zu lösen. Scheinbar könnte ich 'kill' ausführen, allerdings kenne ich die Prozess IDs nicht und kann diese nicht herausfinden.


    Weiß jemand, wie ich das Problem lösen kann?

    • Best Answer

    Ganz konkret weiß ich noch viel zu wenig über den Plesk Phusion Passenger Applikationsserver und Node.js, also einen konkreten Shutdown mit passenger stop habe ich nicht hinbekommen. Und per SSH kommt man wie Du schreibst nicht an die Prozessliste heran, auch wenn kill ja anscheinend als Befehl verfügbar wäre - das kann ich mir auch beim besten Willen nicht als den richtigen Weg vorstellen.


    Was ich noch probieren würde ist, welche Node.js-Befehle ausführen Möglichkeiten der npm zu der Anwendung anbietet. (bei der actualbudget Software aus dem verlinkten Beitrag mit yarn als Paketmanager gibt es auch nur "start" und kein "stop")

    netcup_wcp_nodejs_befehl_yarn_no_stop.png

    WH8000 SE 🥚 20 | WH1000 SE OST22 | WH1000 SE OST23 | WH1000 SE OST24 | WH 🥚🧶🥛🐖 | 🦆 VPS 200 🇺🇦🕊️

  • Danke, du hast mich auf eine Idee gebracht, die schlussendlich auch funktioniert hat. Mit dem npm package find-process konnte ich über find('name', 'node', true) die aktiven Node Prozesse finden und loggen. Über die jeweilige Prozess ID konnte ich dann über SSH mit "kill" alle Prozesse beenden und dann regulär einen einzigen Prozess über "npm start" wieder starten.


    Das wirkt für mich zwar nicht so, als wäre das der richtige Weg, aber es hat funktioniert.

  • Ich bin gerne das Quietsche Entchen und liefere Hinweise 🦆
    Freut mich, dass es etwas gebracht hat und ein möglicher Lösungsweg beschrieben ist ... ich selbst habe find-process zumindest in den Möglichkeiten, die mir das Node.js Dashboard gegeben hat, nicht ausführen. Aber dafür habe ich mit der Materie noch nicht ausreichend beschäftigt.

    WH8000 SE 🥚 20 | WH1000 SE OST22 | WH1000 SE OST23 | WH1000 SE OST24 | WH 🥚🧶🥛🐖 | 🦆 VPS 200 🇺🇦🕊️

  • Ich musste das direkt in meinen Code einbinden. Beim Start meiner Node Anwendung werden damit durch diese alle laufenden Node Prozesse gefunden und geloggt. Das hat den netten Nebeneffekt, dass ich jetzt auch sehe, wie oft das Webhosting meinen Server automatisch schließt. Außerdem habe ich dadurch nach jedem Neustart die richtige Prozess ID (falls ich sie benötigen sollte).


    Eine Lösung direkt über das Control Panel habe ich leider nicht gefunden.

  • Ich denke du gehst damit quasi genau den richtigen Weg :)
    Ich bin überhaupt kein Kenner jeglicher JS Backends aber bei ziemlich vielen anderweitigen z B ApplicationServer oder Webservern gibt es meist entsprechende Shellskripte wie start.sh, stop.sh, (status.sh).

    Diese machen im Prinzip neben einigen anderen ENV Dingen genau das was du machst. Die PID in eine Datei speichern sodass in einer anderen Sitzung zu einem anderen Zeitpunkt per stop.sh die laufende PID gefunden und gekillt werden kann. Weiter wird meist dafür gesorgt, das bei einem schon gestartetem Prozess, kein anderer, per start.sh, gestartet wird. Die status.sh kann dann noch Dinge über das Laufzeitverhalten ausgeben.
    Es ist im Prinzip genau so (vereinfacht) strukturiert wie man es bei einem Service (systemd, init.d etc.) machen würde. Das ist tatsächlich, zumindest meines Wissens nach, die beste Alternative wenn man keinen Zugriff auf anderweitige Hintergrundprozessverwalter hat.

    Eine Integration bzw. einen Zugriff per Plesk oder CP wäre natürlich sehr angenehm :)