Назад | Перейти на главную страницу

Сбросить конфигурацию nginx из запущенного процесса?

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

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

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

Вам понадобится установленный 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 дает нам лучшие шансы на это.

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

nginx -T

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

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

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

идеальный способ - искать ngx_conf_t struct из образа процесса nginx.

Это определяется здесь

http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166

Мой C & gdb - отстой, так что кто-то другой может придумать решение.