So setzen Sie die Ausfallzeit auf Null: Starten Sie den nginx-Server neu

0

So senden Sie ein HUP-Signal und starten den nginx-Server ohne Ausfallzeit mithilfe der Datei Node.js neu

Ritesh Pradhan
quelle

Antworten:

2

Sie brauchen drei Dinge:

  1. Die PID Ihres Nginx-Servers. Gespeichert in:/var/run/nginx.pid

  2. Ein Befehl zum Senden eines SIGHUP( 1) an den Prozess mit dieser PID:

    kill -1 $(cat /var/run/nginx.pid)
    
  3. Eine Möglichkeit für node.js, das zu senden kill. Ich würde mit einem Kind-Prozess gehen .

Ich bin kein Node-Entwickler. Ich habe keine Möglichkeit, diese in etwas Sinnvolles zusammenzufassen, aber das würdest du tun, wenn du wüsstest, was du tust.

Oh, und Ihr Nginx-Server und Ihre Node.JS-App müssen als derselbe Benutzer ausgeführt werden , damit Node das Signal senden kann . Dies ist relativ einfach, kann jedoch Sicherheitsrisiken haben. Möglicherweise möchten Sie stattdessen ein SUID-Skript erstellen, das Node aufruft. Wenn Sie dies jedoch nachlässig tun, kann dies auch Auswirkungen auf die Sicherheit haben.


Alternativ können Sie das processModul zum Ausführen verwenden process.kill(...). Sie müssen noch die PID für nginx einlesen und die Berechtigungen müssen noch sortiert werden.

So ähnlich (ich bin immer noch kein Node-Entwickler, daher ist dies möglicherweise syntaktisch falsch):

var fs = require('fs'),
    process = require('process');

process.kill(fs.readFileSync('/var/run/nginx.pid', "utf8"), 'SIGHUP');
Oli
quelle
0
  1. Erstellen Sie eine Datei im Inneren /etc/sudoers.d/. Nenne es reload-nginx
  2. Fügen Sie das Folgende mit den folgenden Zeilen in reload-nginx ein . %devist eine Benutzergruppe mehrerer Benutzer, die nginx neu laden möchten. Sie können dieses Recht auch auf einen einzelnen Benutzer beschränken

%dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx.service %dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx

Sobald dies erledigt ist, kann jeder, der zur %devGruppe gehört, nginx neu laden, ohne sein Passwort eingeben zu müssen. Sie können dies sofort über die Befehlszeile testen.

Fügen Sie Einträge für den Benutzer hinzu, unter denen nodejs ausgeführt werden soll, und child_processrufen Sie dann mit dem nodejs- Modul Unix-Shell-Befehle wie z sudo systemctl reload nginx. Dies sollte den Trick machen.

Sai Ramachandran
quelle