Dump nginx config du processus en cours d'exécution?

42

Apparemment, je n'aurais pas dû passer la nuit blanche à essayer de déboguer une application. Je voulais redémarrer mon nginx et j'ai découvert que son fichier de configuration était vide. Je ne me rappelle pas l'avoir tronqué, mais des doigts gras et une attention réduite ont probablement joué leur rôle.

Je n'ai pas de sauvegarde de ce fichier de configuration. Je sais que j'aurais dû le faire.

Tant mieux pour moi, le démon nginx actuel est toujours en cours d'exécution. Y at-il un moyen de vider sa configuration dans un fichier de configuration qu'il comprendra plus tard?

Sergio Tulentsev
la source

Réponses:

54

Vous avez besoin d’un gdb installé pour vider les régions de mémoire du processus en cours.

# 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_*

Vous devriez obtenir quelque chose comme "Le fichier binaire correspond à mem_086cb000". Ouvrez ce fichier dans l'éditeur, recherchez config (par exemple, directive "worker_connections"), copiez / collez. Profit!

Mise à jour: Cette méthode n'est pas entièrement fiable. Cela est basé sur l'hypothèse que le processus nginx lira la configuration et n'écrasera / réutilisera pas cette zone mémoire plus tard. Le processus Master nginx nous donne les meilleures chances pour cela, je suppose.

Kupson
la source
2
Merci, mais c'est trop hardcore pour moi. Je vais réécrire le fichier de configuration à partir de zéro :)
Sergio Tulentsev
1
Un fichier mmap'd implique un descripteur de fichier ope. Voir pour un moyen plus facile de récupérer un: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
@JeffFerland nginx ne garde pas ouvert fd pour le fichier de configuration.
Kupson
Oui, la plupart des applications ne ... pensaient pas que j'avais édité mon commentaire après y avoir ajouté mention. Oops.
Jeff Ferland
1
Cela se sent tellement hardcore! Je suis officiellement un pirate maintenant. Relire la mémoire pour retrouver vos configurations. Merci d’avoir expliqué @kupson
Adriaan le
13

Cela ne va pas aider sur cette demande, mais pourrait aider les autres à atteindre ici pour la même raison. Les versions plus récentes de nginx ont l'option -T pour vider la configuration de nginx lue à partir de tous les fichiers de configuration de nginx , et non de la mémoire:

nginx -T

Cela peut être utile pour confirmer qu'un fichier de configuration est en cours de lecture, pour le comparer à un autre serveur ou pour rechercher des configs.

Encore une fois, cela ne videra pas la configuration du processus en cours , mais seulement ce qu'un nouveau processus chargerait.

higuita
la source
2

Ngx_conf_t est un type de structure utilisé pour l'analyse de la configuration. Il n'existe que pendant l'analyse de la configuration et vous ne pouvez évidemment pas y accéder une fois l'analyse de la configuration terminée.

zxc
la source
2
C'est «évidemment» inaccessible simplement parce qu'apparemment, aucune installation de ce type n'est implémentée dans nginx; d'autres programmes ont de telles installations, telles que postconf -npour Postfix ou exim -bPpour Exim ou (le mal nommé) testparm -vpour Samba, etc.
Josip Rodin