84 votes

Vider la configuration de nginx à partir du processus en cours ?

Apparemment, je n'aurais pas dû passer des nuits blanches à essayer de déboguer une application. Je voulais redémarrer mon nginx et j'ai découvert que son fichier de configuration est vide. Je ne me souviens pas l'avoir tronqué, mais les gros doigts et une attention réduite ont probablement joué un rôle.

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

Heureusement pour moi, le démon nginx actuel fonctionne toujours. Y a-t-il un moyen de vider sa configuration dans un fichier de configuration qu'il comprendra plus tard ?

91voto

wolfg Points 51

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 "Binary file mem_086cb000 matches". Ouvrez ce fichier dans un éditeur, cherchez la configuration (par exemple la directive "worker_connections"), copiez et collez. Profit !

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

53voto

devin Points 1614

Cela ne sera pas utile pour cette demande, mais pourrait aider d'autres personnes à atteindre ce but pour la même raison. Les versions plus récentes de nginx ont l'option -T pour vider la configuration de nginx. lecture de tous les fichiers de configuration de nginx pas de mémoire :

nginx -T

Cela peut être utile pour confirmer qu'un fichier de configuration est lu, pour comparer avec un autre serveur ou pour rechercher des configurations.

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

4voto

cincodenada Points 192

Cette réponse est un petit mais je pense utile ajout à la Excellente réponse alors suivez d'abord ces instructions. Ensuite, vous pouvez utiliser ce script pour trouver plus facilement votre configuration.

Une fois que vous avez les vidages de mémoire de la réponse supérieure, vous pouvez utiliser ce script Awk légèrement sur-engineered pour extraire tout ce qui ressemble à un bloc de configuration de niveau supérieur entouré de crochets.

#!/usr/bin/awk -f
### Setup
# We're searching for a keyword followed by an open brace to start
# And the a close brace at the start of a line to end
# Also include commented sections, cause otherwise they look funny
BEGIN {
  start="[[:alpha:]_#]+ \\{$";
  end="^#?}" 
}

# Shortcut to extract a regex pattern from $0
function extract(ere) { return substr($0, match($0, ere), RLENGTH) }

# Check for end conditions first
# This way we end the section before we print below

# For the primary end condition, print out the matched bit
$0 ~ end { print extract(end); go=0}
# And a safety stop: bail on any non-printable lower-ASCII characters
/[\x00-\x08\x0e-\x19]/ { go=0 }

# If we're in a section, print the line!
go {print}

# Otherwise, check for our starting condition
# If we find it, print just that bit and turn on our flag
!go && $0 ~ start {
  go=1;
  print "### Extracted from memory dump:";
  print extract(start)
}

Sauvegarder cela dans extract.awk を実行し awk -f extract.awk mem_* ou si vous préférez les blagues, voilà :

awk 'BEGIN { start="[[:alpha:]_#]+ \\{$"; end="^#?}" } function extract(ere) { return substr($0, match($0, ere), RLENGTH) } $0 ~ end {print extract(end); go=0} /[\x00-\x08\x0e-\x19]/ { go=0 } go {print} !go && $0 ~ start { go=1; print "### Extracted from memory dump:"; print extract(start)}' mem_*

Ce script devrait déverser une liste de sections de configuration de haut niveau que vous pouvez ensuite parcourir pour récupérer celles dont vous avez besoin, sans avoir à fouiller dans un tas d'autres bruits de mémoire.

Note : Awk peut se plaindre de caractères malformés sur STDERR, vous pouvez simplement l'ignorer. Si vous avez un GNU awk récent, vous pouvez ajouter l'option -b indique que vous attendez des données binaires, ce qui fera taire l'avertissement.

Mais pourquoi ?

Oui, vous pouvez simplement parcourir ces vidages ou les ouvrir dans un éditeur et rechercher des blocs, mais il y aura de petits morceaux de votre configuration dispersés dans la carte mémoire, ce qui peut être ennuyeux de creuser. strings perd les espaces blancs, et vous pouvez grep pour des choses comme une accolade suivie d'une nouvelle ligne... mais nous avons des outils pour nous aider à le faire. Et si vous copiez-coller déjà des scripts de ServerFault, vous pourriez aussi bien en faire un de plus pour vous faciliter la vie.

2voto

zxc Points 21

Le ngx_conf_t est un type de structure utilisé pour la configuration. l'analyse syntaxique. Elle n'existe que pendant l'analyse de la configuration, et évidemment, vous ne pouvez pas y accéder après que l'analyse de la configuration est terminée.

1voto

Joe Gauterin Points 9526

L'idéal est de chercher le ngx_conf_t struct de l'image du processus nginx.

Il est défini ici

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

Mon C & gdb est nul, donc quelqu'un d'autre pourrait trouver une solution.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X