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?

Sergio Tulentsev
fonte

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.

Kupson
fonte
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.

higuita
fonte
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.

zxc
fonte
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