Dump di nginx config dal processo in esecuzione?


42

Apparentemente, non avrei dovuto passare la notte insonne a provare a eseguire il debug di un'applicazione. Volevo riavviare il mio nginx e ho scoperto che il suo file di configurazione è vuoto. Non ricordo di averlo troncato, ma le dita grasse e l'attenzione ridotta probabilmente hanno fatto la loro parte.

Non ho il backup di quel file di configurazione. So che avrei dovuto farlo.

Bene per me, l'attuale demone nginx è ancora in esecuzione. C'è un modo per scaricare la sua configurazione in un file di configurazione che capirà in seguito?

Risposte:


53

È necessario un gdb installato per scaricare le aree di memoria del processo in esecuzione.

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

Dovresti ottenere qualcosa del tipo "Corrispondenze file binari mem_086cb000". Apri questo file nell'editor, cerca config (es. Direttiva "worker_connections"), copia e incolla. Profitto!

Aggiornamento: questo metodo non è del tutto affidabile. Si basa sul presupposto che il processo nginx leggerà la configurazione e non sovrascriverà / riutilizzerà quest'area di memoria in un secondo momento. Il processo master nginx ci offre le migliori possibilità per quello che immagino.


2
Grazie, ma questo è troppo hardcore per me. Riscriverò il file di configurazione da zero :)
— Sergio Tulentsev,

1
Un file mmap'd implica un filehandle di ope. Consulta per un modo più semplice per recuperarne uno: serverfault.com/questions/45237/link-to-a-specific-inode
— Jeff Ferland

@JeffFerland nginx non tiene aperto fd per il file di configurazione.
— kupson,

Sì, la maggior parte delle applicazioni non ... pensavo di aver modificato il mio commento dopo per includere la menzione. Ops.
— Jeff Ferland,

1
Sembra così hardcore! Sono ufficialmente un hacker ora. Leggere la memoria per ritrovare le tue configurazioni. Grazie per aver spiegato @kupson
— adriaan il

12

Questo non aiuterà su questa richiesta, ma potrebbe aiutare altri a raggiungere qui per lo stesso motivo. Le versioni nginx più recenti hanno l'opzione -T per scaricare la configurazione di nginx da tutti i file di configurazione di nginx , non dalla memoria:

nginx -T

Ciò può essere utile per confermare la lettura di un file di configurazione, per confrontarlo con altri server o per cercare configurazioni.

Ancora una volta, questo non scaricherà la configurazione dal processo in esecuzione , ma solo ciò che verrebbe caricato da un nuovo processo.


2

Ngx_conf_t è un tipo di struttura utilizzata per l'analisi della configurazione. Esiste solo durante l'analisi della configurazione e ovviamente non è possibile accedervi una volta completata l'analisi della configurazione.


2
È 'ovviamente' inaccessibile solo perché apparentemente non esiste una tale struttura implementata in nginx; altri programmi dispongono di tali servizi, come postconf -nPostfix o exim -bPExim o (il nome sbagliato) testparm -vper Samba, ecc.
— Josip Rodin,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.