从运行进程转储nginxconfiguration?

显然,我不应该花费不眠之夜试图debugging一个应用程序。 我想重新启动我的nginx,发现它的configuration文件是空的。 我不记得把它截断了,但是粗糙的手指和减less的注意力可能起到了它们的作用。

我没有该configuration文件的备份。 我知道我应该做到这一点。

对我来说很好,目前的nginx守护进程还在运行。 有没有办法将其configuration转储到configuration文件,以后会明白?

您需要安装一个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匹配”。 在编辑器中打开此文件,searchconfiguration(例如“worker_connections”指令),复制并粘贴。 利润!

更新:这种方法不是完全可靠的。 这是基于假定nginx进程将读取configuration,稍后不覆盖/重新使用这个内存区域。 Master nginx进程为我提供了最好的机会。

这对这个请求没有任何帮助,但是也可以帮助其他人以相同的原因到达这里。 较新的nginx版本具有-T选项来转储从所有nginxconfiguration文件中读取的nginxconfiguration ,而不是从内存中读取

nginx -T

这可以用来确认configuration文件正在被读取,与其他服务器进行比较或者searchconfiguration。

同样,这不会从正在运行的进程转储configuration ,只会载入一个新的进程。

ngx_conf_t是一种用于configurationparsing的结构。 它只在configurationparsing时才存在,显然configurationparsing完成后无法访问。

理想的方法是从nginx进程映像中查找ngx_conf_t结构。

这是在这里定义的

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

我的C&GDB糟透了,别人可能会想出一个解决scheme。