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

Ser*_*sev 59 nginx

显然,我不应该花费不眠之夜试图调试应用程序。我想重新启动我的 nginx 并发现它的配置文件是空的。我不记得截断它,但胖手指和减少注意力可能起到了作用。

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

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

kup*_*son 68

您需要安装 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_*
Run Code Online (Sandbox Code Playgroud)

您应该得到类似“二进制文件 mem_086cb000 匹配项”的信息。在编辑器中打开此文件,搜索配置(例如“worker_connections”指令),复制并粘贴。利润!

更新:这种方法并不完全可靠。它基于 nginx 进程将读取配置并且稍后不会覆盖/重用该内存区域的假设。我想掌握 nginx 进程为我们提供了最好的机会。

  • 谢谢,但这对我来说太硬核了。我将从头开始重写配置文件:) (3认同)
  • 这感觉太硬核了!我现在正式成为一名黑客了。读取内存以找回您的配置。感谢您的解释@kupson (3认同)
  • 这可能是我见过的最酷的事情...谢谢!我能够使用 `grep server_name mem_*` 吐出一个文件,然后在 nano 中搜索 `location /` 并获取整个文件。 (2认同)
  • 为了使它更容易:我编写了一个 awk 脚本来自动从这些转储中提取完整的配置块,并发布在另一个答案中:https://serverfault.com/a/1090838/86724 (2认同)

hig*_*ita 29

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

nginx -T

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

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