Дамп конфига nginx из запущенного процесса?

42

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

У меня нет резервной копии этого файла конфигурации. Я знаю, что должен был это сделать.

Хорошо, текущий демон nginx все еще работает. Есть ли способ вывести свою конфигурацию в конфигурационный файл, который он поймет позже?

Серхио Туленцев
источник

Ответы:

54

Вам нужен установленный 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 соответствий». Откройте этот файл в редакторе, найдите конфигурацию (например, директива worker_connections), скопируйте и вставьте. Прибыль!

Обновление: этот метод не совсем надежен. Он основан на предположении, что процесс nginx будет считывать конфигурацию и не перезаписывать / повторно использовать эту область памяти позже. Мастер процесса nginx дает нам наилучшие шансы на это.

kupson
источник
2
Спасибо, но это слишком сложно для меня. Я
перепишу
1
Файл mmap'd подразумевает дескриптор файла ope. См. Более простой способ его восстановления: serverfault.com/questions/45237/link-to-a-specific-inode
Джефф Ферланд
@JeffFerland nginx не храните открытый файл конфигурации.
Купсон
Да, большинство приложений не ... думал, что я отредактировал свой комментарий после включения упоминания. К сожалению.
Джефф Ферланд
1
Это так ужасно! Теперь я официально хакер. Чтение памяти, чтобы найти ваши конфиги обратно. Спасибо за объяснение @kupson
adriaan
13

Это не поможет по этому запросу, но может помочь другим, находящимся здесь по той же причине. Более новые версии nginx имеют опцию -T для выгрузки конфигурации nginx, прочитанной из всех файлов конфигурации nginx , а не из памяти:

nginx -T

Это может быть полезно для подтверждения того, что файл конфигурации читается, для сравнения с другим сервером или для поиска конфигураций.

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

Игиты
источник
2

Ngx_conf_t - это тип структуры, используемой для разбора конфигурации. Он существует только во время анализа конфигурации, и, очевидно, вы не сможете получить к нему доступ после завершения анализа конфигурации.

ZXC
источник
2
Это «очевидно» недоступно только потому, что в nginx, по-видимому, нет такого средства; другие программы имеют такие возможности, как postconf -nдля Postfix или exim -bPдля Exim или (с плохим названием) testparm -vдля Samba и т. д.
Josip Rodin