Видимо, не стоило тратить бессонную ночь на отладку приложения. Я хотел перезапустить свой 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 - отстой, так что кто-то другой может придумать решение.