Zrzucić konfigurację Nginx z uruchomionego procesu?


42

Najwyraźniej nie powinienem spędzać bezsennej nocy próbując debugować aplikację. Chciałem zrestartować mój nginx i odkryłem, że jego plik konfiguracyjny jest pusty. Nie pamiętam obcinania go, ale grube palce i zmniejszona uwaga prawdopodobnie odegrały swoją rolę.

Nie mam kopii zapasowej tego pliku konfiguracyjnego. Wiem, że powinienem był to zrobić.

Dobrze dla mnie, aktualny demon nginx nadal działa. Czy istnieje sposób na zrzucenie konfiguracji do pliku konfiguracyjnego, który zrozumie później?

Odpowiedzi:


53

Musisz zainstalować gdb, aby zrzucić obszary pamięci uruchomionego procesu.

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

Powinieneś dostać coś takiego jak „Binarny plik mem_086cb000 dopasowań”. Otwórz ten plik w edytorze, wyszukaj config (np. Dyrektywa „worker_connections”), skopiuj i wklej. Zysk!

Aktualizacja: Ta metoda nie jest całkowicie niezawodna. Opiera się na założeniu, że proces nginx odczyta konfigurację i nie nadpisuje / nie wykorzystuje tego obszaru pamięci później. Wydaje mi się, że proces Master Nginx daje nam najlepsze szanse.


2
Dzięki, ale to dla mnie zbyt hardkorowe.
Przepiszę

1
Plik mmap'd oznacza uchwyt pliku operacji. Znajdź łatwiejszy sposób na odzyskanie jednego: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx nie trzymaj otwartego fd dla pliku konfiguracyjnego.
kupson,

Tak, większość aplikacji nie ... myślałam, że zredagowałam swój komentarz po tym, by dołączyć wzmiankę. Ups
Jeff Ferland

1
To jest takie hardkorowe! Teraz jestem oficjalnie hakerem. Odczytywanie pamięci w celu odnalezienia konfiguracji. Dzięki za wyjaśnienie @kupson
adriaan

12

To nie pomoże w tej prośbie, ale może pomóc innym dotrzeć tutaj z tego samego powodu. Nowsze wersje nginx mają opcję -T, aby zrzucić konfigurację nginx odczytaną ze wszystkich plików konfiguracyjnych nginx , a nie z pamięci:

nginx -T

Może to być przydatne do potwierdzenia, że ​​plik konfiguracyjny jest odczytywany, do porównania z innym serwerem lub do wyszukiwania konfiguracji.

Ponownie nie spowoduje to zrzucenia konfiguracji z uruchomionego procesu , a jedynie załadowanie nowego procesu.


2

Ngx_conf_t jest rodzajem struktury używanej do analizowania konfiguracji. Istnieje tylko podczas analizowania konfiguracji i oczywiście nie można uzyskać do niego dostępu po zakończeniu analizy konfiguracji.


2
Jest „oczywiście” niedostępny, ponieważ najwyraźniej w Nginxie nie ma takiej możliwości; inne programy mają takie udogodnienia, jak postconf -nPostfix lub exim -bPExim lub (źle nazwane) testparm -vSamba itp.
Josip Rodin

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.