从正在运行的进程中转储 nginx 配置?

从正在运行的进程中转储 nginx 配置?

显然,我不应该整夜不眠地调试应用程序。我想重新启动 nginx,却发现它的配置文件是空的。我不记得截断过它,但手指粗和注意力不集中可能是原因之一。

我没有备份该配置文件。我知道我应该备份。

对我来说很好,当前的 nginx 守护进程仍在运行。有没有办法将其配置转储到稍后可以理解的配置文件中?

答案1

您需要安装 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 进程会给我们带来最好的机会。

答案2

这对这个请求没有帮助,但可能对出于同样原因到达这里的其他人有帮助。较新的 nginx 版本有 -T 选项来转储 nginx 配置从所有 nginx 配置文件中读取,不是来自记忆:

nginx -T

这对于确认正在读取配置文件、与其他服务器进行比较或搜索配置很有用。

再次,这将不从正在运行的进程中转储配置,仅新进程会加载的内容。

答案3

ngx_conf_t 是一个用于配置解析的结构体类型,它只在配置解析过程中存在,配置解析完成后显然就无法访问它了。

答案4

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

它定义在这里

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

我的 C 和 gdb 很差劲,所以其他人可以想出解决方案。

相关内容