Выгружаем конфиг из памяти


У Nginx есть 2 полезных ключа:

  • -t
  • -T

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

nginx -t
nginx reload

А вот может сложиться ситуация когда вам нужно сохранить конфиги в один файл, как их видит nginx. Для этих целей есть ключ -T:

nginx -T > dump.conf

Но это не данные из памяти процесса. Это именно склейка конфигов — то, как их будет смотреть и парсить Nginx сервер.

Как достать конфиги из памяти запущенного Nginx?

Тут нам понадобятся gdb и какая-то магия в виде умения запустить нужные команды:

# Узнаем PID процесса
ps ax | grep nginx
10063 pts/1 S+ 0:00 grep --color=auto nginx
12467 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
12469 ? S 0:42 nginx: worker process
# Сохраняем PID для удобства
pid=
12467

# Генерируем gdb команды
cat /proc/$pid/maps | awk '$6 !~ "^/" {split ($1,addrs,"-"); print "dump memory mem_" addrs[1] " 0x" addrs[1] " 0x" addrs[2] ;}END{print "quit"}' > gdbcmds

# Запускаем gdb с флагом -x чтобы сдампить участки памяти в файлы с префиксом mem_*
gdb -p $pid -x gdbcmds

# Ищем нужные куски nginx.conf в файлах
grep server_name mem_*

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