Видимо, я не должен был провести бессонную ночь, пытаясь отладить приложение. Я хотел перезапустить мой 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 дает нам наилучшие шансы на это.
@JeffFerland nginx не храните открытый файл конфигурации.
Купсон
Да, большинство приложений не ... думал, что я отредактировал свой комментарий после включения упоминания. К сожалению.
Джефф Ферланд
1
Это так ужасно! Теперь я официально хакер. Чтение памяти, чтобы найти ваши конфиги обратно. Спасибо за объяснение @kupson
adriaan
13
Это не поможет по этому запросу, но может помочь другим, находящимся здесь по той же причине. Более новые версии nginx имеют опцию -T для выгрузки конфигурации nginx, прочитанной из всех файлов конфигурации nginx , а не из памяти:
nginx -T
Это может быть полезно для подтверждения того, что файл конфигурации читается, для сравнения с другим сервером или для поиска конфигураций.
Опять же, это не приведет к сбросу конфигурации из запущенного процесса , только к тому, что будет загружен новый процесс.
Ngx_conf_t - это тип структуры, используемой для разбора конфигурации. Он существует только во время анализа конфигурации, и, очевидно, вы не сможете получить к нему доступ после завершения анализа конфигурации.
Это «очевидно» недоступно только потому, что в nginx, по-видимому, нет такого средства; другие программы имеют такие возможности, как postconf -nдля Postfix или exim -bPдля Exim или (с плохим названием) testparm -vдля Samba и т. д.
Josip Rodin
0
идеальный способ - искать ngx_conf_tструктуру из образа процесса nginx.
Это не поможет по этому запросу, но может помочь другим, находящимся здесь по той же причине. Более новые версии nginx имеют опцию -T для выгрузки конфигурации nginx, прочитанной из всех файлов конфигурации nginx , а не из памяти:
nginx -T
Это может быть полезно для подтверждения того, что файл конфигурации читается, для сравнения с другим сервером или для поиска конфигураций.
Опять же, это не приведет к сбросу конфигурации из запущенного процесса , только к тому, что будет загружен новый процесс.
источник
Ngx_conf_t - это тип структуры, используемой для разбора конфигурации. Он существует только во время анализа конфигурации, и, очевидно, вы не сможете получить к нему доступ после завершения анализа конфигурации.
источник
postconf -n
для Postfix илиexim -bP
для Exim или (с плохим названием)testparm -v
для Samba и т. д.идеальный способ - искать
ngx_conf_t
структуру из образа процесса nginx.Здесь определяется
http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166
Мой C & GDB отстой, так что дома кто-то другой может найти решение.
источник