Nginx config vom laufenden Prozess sichern?

42

Anscheinend hätte ich keine schlaflose Nacht damit verbringen sollen, eine Anwendung zu debuggen. Ich wollte mein nginx neu starten und habe festgestellt, dass die Konfigurationsdatei leer ist. Ich erinnere mich nicht, es abgeschnitten zu haben, aber dicke Finger und reduzierte Aufmerksamkeit spielten wahrscheinlich ihre Rolle.

Ich habe keine Sicherung dieser Konfigurationsdatei. Ich weiß, ich hätte es schaffen sollen.

Gut, dass der aktuelle Nginx-Daemon noch läuft. Gibt es eine Möglichkeit, die Konfiguration in eine Konfigurationsdatei zu kopieren, die später verstanden wird?

Sergio Tulentsev
quelle

Antworten:

53

Sie benötigen eine installierte GDB, um Speicherbereiche des laufenden Prozesses zu sichern.

# Set pid of nginx master process here
pid=8192

# generate gdb commands from the process's memory mappings using awk
cat /proc/$pid/maps | awk '$6 !~ "^/" {split ($1,addrs,"-"); print "dump memory mem_" addrs[1] " 0x" addrs[1] " 0x" addrs[2] ;}END{print "quit"}' > gdb-commands

# use gdb with the -x option to dump these memory regions to mem_* files
gdb -p $pid -x gdb-commands

# look for some (any) nginx.conf text
grep worker_connections mem_*
grep server_name mem_*

Sie sollten so etwas wie "Binärdatei mem_086cb000 Übereinstimmungen" erhalten. Öffne diese Datei im Editor, suche nach config (zB "worker_connections" Direktive), kopiere & füge sie ein. Profitieren!

Update: Diese Methode ist nicht ganz zuverlässig. Es basiert auf der Annahme, dass der Nginx-Prozess die Konfiguration liest und diesen Speicherbereich später nicht überschreibt / wiederverwendet. Der Master-Nginx-Prozess gibt uns die besten Chancen dafür, denke ich.

Kupson
quelle
2
Danke, aber das ist zu hardcore für mich. Ich werde die Konfigurationsdatei von Grund auf neu schreiben :)
Sergio Tulentsev
1
Eine mmap'd-Datei impliziert ein ope-Dateihandle. Eine einfachere Möglichkeit zur Wiederherstellung finden Sie unter: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
@ JeffFerland nginx nicht offen halten fd für Konfigurationsdatei.
Kupson
Ja, die meisten Anwendungen haben nicht gedacht, dass ich meinen Kommentar nachher bearbeitet habe, um ihn zu erwähnen. Hoppla.
Jeff Ferland
1
Das fühlt sich so hardcore an! Ich bin jetzt offiziell ein Hacker. Speicher auslesen, um deine Configs wiederzufinden. Danke, dass du
@
12

Dies wird bei dieser Anfrage nicht helfen, könnte aber anderen aus dem gleichen Grund helfen, hierher zu gelangen. Neuere Nginx-Versionen haben die Option -T, um die Nginx-Konfiguration zu sichern, die aus allen Nginx-Konfigurationsdateien gelesen wurde , nicht aus dem Speicher:

nginx -T

Dies kann nützlich sein, um zu bestätigen, dass eine Konfigurationsdatei gelesen wird, um sie mit anderen Servern zu vergleichen oder um nach Konfigurationen zu suchen.

Auch hier wird die Konfiguration nicht aus dem laufenden Prozess ausgegeben, sondern nur das, was ein neuer Prozess laden würde.

Higuita
quelle
2

Die ngx_conf_t ist ein Typ einer Struktur, die für das Konfigurations-Parsing verwendet wird. Es ist nur während der Konfigurationsanalyse vorhanden, und Sie können offensichtlich nicht darauf zugreifen, nachdem die Konfigurationsanalyse abgeschlossen ist.

zxc
quelle
2
Es ist "offensichtlich" unzugänglich, nur weil anscheinend keine solche Funktion in Nginx implementiert ist. andere Programme haben solche Einrichtungen, wie postconf -nfür Postfix oder exim -bPfür Exim oder (der schlecht benannte) testparm -vfür Samba usw.
Josip Rodin