¿Volcar la configuración nginx del proceso en ejecución?

42

Aparentemente, no debería haber pasado la noche en vela tratando de depurar una aplicación. Quería reiniciar mi nginx y descubrí que su archivo de configuración está vacío. No recuerdo haberlo truncado, pero los dedos gordos y la atención reducida probablemente jugaron su parte.

No tengo copia de seguridad de ese archivo de configuración. Sé que debería haberlo hecho.

Bien por mí, el demonio nginx actual todavía se está ejecutando. ¿Hay alguna manera de volcar su configuración en un archivo de configuración que comprenderá más adelante?

Sergio Tulentsev
fuente

Respuestas:

54

Necesita un gdb instalado para volcar las regiones de memoria del proceso en ejecución.

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

Debería obtener algo como "El archivo binario mem_086cb000 coincide". Abra este archivo en el editor, busque la configuración (por ejemplo, la directiva "trabajador_conexiones"), copie y pegue. ¡Lucro!

Actualización: este método no es del todo confiable. Se basa en la suposición de que el proceso nginx leerá la configuración y no sobrescribirá / reutilizará esta área de memoria más adelante. El proceso maestro nginx nos da las mejores oportunidades para eso, supongo.

Kupson
fuente
2
Gracias, pero esto es demasiado duro para mí. Reescribiré el archivo de configuración desde cero :)
Sergio Tulentsev
1
Un archivo mmap'd implica un identificador de archivo ope. Busque
Jeff Ferland
@JeffFerland nginx no mantiene abierto fd para el archivo de configuración.
kupson 01 de
Sí, la mayoría de las aplicaciones no ... pensé que edité mi comentario después para incluir la mención. Ups
Jeff Ferland el
1
¡Esto se siente tan duro! Soy oficialmente un hacker ahora. Lectura de memoria para encontrar sus configuraciones de nuevo. Gracias por explicar @kupson
adriaan
13

Esto no ayudará en esta solicitud, pero podría ayudar a otros que lleguen aquí por la misma razón. Las versiones más recientes de nginx tienen la opción -T para volcar la lectura de configuración de nginx de todos los archivos de configuración de nginx , no de la memoria:

nginx -T

Esto puede ser útil para confirmar que se está leyendo un archivo de configuración, para compararlo con otro servidor o buscar configuraciones.

Nuevamente, esto no volcará la configuración del proceso en ejecución , solo lo que cargaría un nuevo proceso.

higuita
fuente
2

El ngx_conf_t es un tipo de estructura utilizada para el análisis de la configuración. Solo existe durante el análisis de la configuración, y obviamente no puede acceder después de que se complete el análisis de la configuración.

zxc
fuente
2
Es 'obviamente' inaccesible solo porque aparentemente no hay tal instalación implementada en nginx; otros programas tienen tales servicios, como postconf -nPostfix o exim -bPExim o (los mal nombrados) testparm -vpara Samba, etc.
Josip Rodin