Despejar a configuração do nginx do processo em execução?


42

Aparentemente, eu não deveria ter passado a noite sem dormir tentando depurar um aplicativo. Eu queria reiniciar meu nginx e descobri que seu arquivo de configuração está vazio. Não me lembro de truncá-lo, mas dedos gordos e atenção reduzida provavelmente desempenharam seu papel.

Não tenho backup desse arquivo de configuração. Eu sei que deveria ter conseguido.

Bom para mim, o daemon nginx atual ainda está em execução. Existe uma maneira de despejar sua configuração em um arquivo de configuração que ele entenderá mais tarde?

Respostas:


53

Você precisa de um gdb instalado para despejar regiões de memória do processo em execução.

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

Você deve obter algo como "Arquivo binário mem_086cb000 corresponde". Abra este arquivo no editor, procure pela configuração (por exemplo, diretiva "worker_connections"), copie e cole. Lucro!

Atualização: este método não é totalmente confiável. É baseado na suposição de que o processo nginx lerá a configuração e não substituirá / reutilizará esta área de memória posteriormente. O processo mestre do nginx nos dá as melhores chances para isso, eu acho.


2
Obrigado, mas isso é muito grave para mim. Vou reescrever o arquivo de configuração a partir do zero :)
Sergio Tulentsev

1
Um arquivo mmap'd implica uma manipulação de arquivo ope. Veja uma maneira mais fácil de recuperar um: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx não mantém aberto fd para o arquivo de configuração.
Kupson

Sim, a maioria dos aplicativos não ... pensei que eu editei meu comentário depois para incluir menção. Opa
Jeff Ferland

1
Isso parece tão hardcore! Sou oficialmente um hacker agora. Lendo a memória para encontrar suas configurações de volta. Obrigado por explicar @kupson
adriaan

12

Isso não ajudará nessa solicitação, mas poderá ajudar outros usuários a chegar aqui pelo mesmo motivo. As versões mais recentes do nginx têm a opção -T para despejar a leitura de configuração do nginx de todos os arquivos de configuração do nginx , não da memória:

nginx -T

Isso pode ser útil para confirmar que um arquivo de configuração está sendo lido, para comparar com outro servidor ou procurar configurações.

Novamente, isso não fará o dump da configuração do processo em execução , apenas o que um novo processo carregaria.


2

O ngx_conf_t é um tipo de estrutura usada para análise de configuração. Ele existe apenas durante a análise da configuração e, obviamente, você não pode acessá-lo após a conclusão da análise.


2
É 'obviamente' inacessível apenas porque aparentemente não existe esse recurso implementado no nginx; outros programas têm tais instalações, como postconf -npara Postfix ou exim -bPpara Exim ou (o mal chamado) testparm -vpara Samba, etc.
Josip Rodin

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.