Frage Dump nginx config aus dem laufenden Prozess?


Anscheinend hätte ich keine schlaflose Nacht damit verbringen sollen, eine Anwendung zu debuggen. Ich wollte mein nginx neu starten und entdeckte, dass seine Konfigurationsdatei leer ist. Ich kann mich nicht daran erinnern, es abgeschnitten zu haben, aber dicke Finger und reduzierte Aufmerksamkeit haben wahrscheinlich ihre Rolle gespielt.

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

Gut für mich, der aktuelle Nginx-Daemon läuft noch. Gibt es eine Möglichkeit, seine Konfiguration in eine Konfigurationsdatei zu speichern, die sie später verstehen wird?


34
2018-02-18 06:49


Ursprung




Antworten:


Sie benötigen eine installierte Gdb, um Speicherbereiche des laufenden Prozesses zu entladen.

# 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 etwas wie "Binärdatei mem_086cb000 passt" erhalten. Öffnen Sie diese Datei im Editor, suchen Sie nach der Konfiguration (z. B. "worker_connections" -Direktive), kopieren und einfügen. Profitieren!

Aktualisieren: Diese Methode ist nicht absolut zuverlässig. Es basiert auf der Annahme, dass der nginx-Prozess die Konfiguration liest und diesen Speicherbereich später nicht überschreibt / wieder verwendet. Der Master-Nginx-Prozess gibt uns die besten Chancen dafür.


47
2018-02-18 13:50



Danke, aber das ist zu schwer für mich. Ich werde die Konfigurationsdatei von Grund auf neu schreiben :) - Sergio Tulentsev
Eine mmap'd-Datei impliziert einen ope-Dateihandle. Siehe für eine einfachere Möglichkeit, einen wiederherzustellen: serverfault.com/questions/45237/link-to-a-spezifische-inode - Jeff Ferland
@JeffFerland nginx nicht offen fd für die Konfigurationsdatei. - kupson
Ja, die meisten Anwendungen nicht ... dachten, ich habe meinen Kommentar bearbeitet, um ihn zu erwähnen. Hoppla. - Jeff Ferland
Genial! Das funktioniert für mich. Vielen Dank:-) - yegle


Dies wird bei dieser Anfrage nicht helfen, könnte aber anderen helfen, aus demselben Grund hier zu erreichen. Neuere nginx-Versionen haben die Option -T, um die nginx-Konfiguration zu speichern Lesen Sie aus allen Nginx-Konfigurationsdateien, nicht aus dem Gedächtnis:

nginx -T

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

Auch dies wird es tun lade die Konfiguration nicht aus dem laufenden Prozess, nur was ein neuer Prozess laden würde.


7
2017-10-27 16:39





Der ngx_conf_t ist ein Typ einer Struktur, die für die Konfiguration verwendet wird Parsing. Es existiert nur während der Konfigurationsanalyse und Natürlich kann man nicht darauf zugreifen, nachdem die Konfiguration analysiert wurde Komplett.


2
2017-11-07 12:44



Es ist "offensichtlich" unzugänglich, nur weil anscheinend keine solche Einrichtung in nginx implementiert ist; andere Programme haben solche Einrichtungen, wie z postconf -n für Postfix oder exim -bP für Exim oder (der schlecht benannte) testparm -v für Samba usw. - Josip Rodin


Der ideale Weg ist es, nach dem zu suchen ngx_conf_t Struktur von Nginx-Prozessabbild.

Es ist hier definiert

http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166

Mein C & Gdb saugt so nach Hause, dass jemand anders eine Lösung finden könnte.


0
2017-10-09 03:24