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


42

显然,我不应该花很多时间去调试应用程序。我想重启我的Nginx,发现它的配置文件为空。我不记得删节了,但是胖手指和注意力下降可能是他们起作用的原因。

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

对我有好处,当前的nginx守护程序仍在运行。有没有办法将其配置转储到以后将了解的配置文件中?

Answers:


53

您需要安装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
谢谢,但这对我来说太难了。我将从头开始重写配置文件:)
Sergio Tulentsev '02

1
一个mmap文件意味着一个ope文件句柄。请参阅以获取更简单的恢复方法:serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland 2012年

@JeffFerland nginx不要为配置文件保持打开状态。
kupson 2012年

是的,大多数应用程序都没有...以为我在编辑后添加了评论。哎呀。
杰夫·弗兰

1
这感觉很硬!我现在正式是黑客。读出内存以找到您的配置。感谢您解释@kupson
adriaan

12

这对于此请求将无济于事,但出于相同原因,可能会帮助其他人到达此处。较新的nginx版本具有-T选项,以转储从所有nginx配置文件(而不是从内存)读取的nginx配置

nginx -T

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

同样,这不会从正在运行的进程中转储配置,而只会转储新进程将加载的配置。


2

ngx_conf_t是用于配置解析的一种结构类型。它仅在配置解析期间存在,并且显然在配置解析完成后您将无法访问它。


2
“显然”无法访问,只是因为显然在nginx中没有实现这种功能。其他方案有这样的设施,如postconf -nPostfix的或exim -bP对进出口或(在严重命名)testparm -v为Samba等
约瑟普·罗丹

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.