Вивантажити nginx config з запущеного процесу?


42

Мабуть, я не повинен був проводити безсонну ніч, намагаючись налагодити додаток. Я хотів перезапустити свій nginx і виявив, що його конфігураційний файл порожній. Я не пам’ятаю, щоб це обрізали, але жирні пальці та зменшена увага, ймовірно, грали свою роль.

У мене немає резервної копії цього конфігураційного файла. Я знаю, що я повинен був це зробити.

Добре для мене, поточний демон nginx все ще працює. Чи є спосіб скинути його конфігурацію до конфігураційного файлу, який він зрозуміє пізніше?

Відповіді:


53

Вам потрібно встановити gdb, щоб скинути області пам'яті запущеного процесу.

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

У вас повинно вийти щось на зразок "Бінарний файл mem_086cb000 відповідає". Відкрийте цей файл у редакторі, знайдіть конфігурацію (наприклад, директива "working_connections"), скопіюйте та вставте. Прибуток!

Оновлення: Цей метод не зовсім надійний. Він заснований на припущенні, що процес nginx буде читати конфігурацію і не перезаписувати / повторно використовувати цю область пам'яті пізніше. Процес майстра nginx дає нам найкращі шанси на це, я думаю.


2
Дякую, але це для мене занадто хардкор. Я перепишу конфігураційний файл з нуля :)
Серхіо Туленцев

1
Файл mmap'd передбачає операційний файл файлів. Подивіться простіший спосіб відновити його: serverfault.com/questions/45237/link-to-a-specific-inode
Джефф Ферланд,

@JeffFerland nginx не залишає відкритим fd для конфігураційного файла.
kupson

Так, більшість програм не вважають, що я редагував свій коментар після включення згадки. На жаль
Джефф Ферланд

1
Це відчувається настільки хардкор! Я зараз офіційно хакер. Зчитування пам'яті, щоб знайти назад свої конфігурації Дякую за пояснення @kupson
adriaan

12

Це не допоможе в цьому запиті, але може допомогти іншим, хто звернувся сюди з тієї ж причини. Новіші версії nginx мають опцію -T, щоб скинути конфігурацію nginx, прочитану з усіх файлів конфігурації nginx , а не з пам'яті:

nginx -T

Це може бути корисно для підтвердження того, що конфігураційний файл читається, для порівняння з іншим сервером або пошуку конфігурацій.

Знову ж таки, це не скидає конфігурацію з запущеного процесу , лише те, що завантажиться новий процес.


2

Ngx_conf_t - це тип структури, що використовується для розбору конфігурації. Він існує лише під час розбору конфігурації, і очевидно, ви не можете отримати доступ до нього після завершення розбору конфігурації.


2
Це "очевидно" недоступно лише тому, що, мабуть, немає такої можливості, реалізованої в nginx; інші програми мають такі засоби, як postconf -nPostfix або exim -bPдля Exim або (погано названі) testparm -vдля Samba тощо.
Йосип Родін,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.