今天在测试环境,手贱误删nginx配置文件,但又没有备份,吓得我赶紧抽根烟冷静冷静,当冷静下来之后,思索着怎么办?因为我人懒,不想重新搭建测试环境。接下来...
注意:在这个时候千万不要杀掉nginx进程,只要进程在运行就好办,不然nginx的配置文件就无法恢复了。
恢复思路
- 经过笔者的头脑风暴,最重要的两个恢复步骤:
- 从加载到内存中的Nginx进程入手,找出加载在内存中的配置文件
- 通过gdb命令对配置文件进行解析和导出到本WIN环境
- 在windows环境使用hexdump工具对配置文件进行解析(或者说解码)
- gdb命令是什么鬼?
它是一个强大的UNIX/Linux下的程序调试工具也是主线Linux 内核具备功能,优点是具有修复网络断点以及恢复链接等功能 ,GDB可以理解线程的名字,在Linux里这个命令“线程名称”(指定一个名称)和“线程找到[REGEXP]”(匹配名称、目标ID,或者额外的信息),还可以调试多线程的程序, 可以使用 info threads命令获取线程的信息,这里就讲它在Linux里怎么使用才能恢复数据。
我们为什么要使用GDB命令来恢复数据? ,因为它允许您查看另一个程序在执行时“内部”发生的事情——或者另一个程序在崩溃时正在做什么,假如当你的程序停止时,它还会检查发生了什么,这就是我们为什么要用的原因,在这里就不细说了。
在这之前,还需了解一个神秘的目录
- 除了使用到gdb命令外,最重要的一点,是我们还要知道到/proc/$pid/maps目录,那这个目录是干什么的呢?其实这个目录里的文件包含了当前进程内存映射区域和访问权限信息,一个文件可以映射到进程的一段内存区域中,映射的文件描述符保存在vm_area_struct->vm_file域中,这种内存区域叫做有名内存区域,相反,属于匿名映射内存区域。
- 下面是在/proc/$pid/maps目录里看到的nginx部分样例数据:
00400000-004b7000 r-xp 00000000 fd:00 55473647 /opt/aspire/product/nginx/sbin/nginx 006b6000-006b7000 r--p 000b6000 fd:00 55473647 /opt/aspire/product/nginx/sbin/nginx 006b7000-006cb000 rw-p 000b7000 fd:00 55473647 /opt/aspire/product/nginx/sbin/nginx 006cb000-006ea000 rw-p 00000000 00:00 0 0182d000-0186f000 rw-p 00000000 00:00 0 [heap] 0186f000-01891000 rw-p 00000000 00:00 0 [heap]
关于GDB命令的安装方式
- 安装方式有很多,如源码编译安装、rpm、二进制包,笔者的环境是可直接出外网,为了方便直接就使用yum进行安装:
yum install gdb
安装好之后,找到Nginx master的进程ID。
正式开干!依次按下面的步骤进行恢复
注意:下面所执行命令后生成的文件都会在当前目下。
- 在命令行执行:
[root@localhost ~]# pid=7879 #(nginx master的IP)
- 敲回车输入以下命令:
[root@localhost ~]# 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-command
- gdb会根据变量的类型输出变量的值
- (-p)是进程的ID, (-x)是按十六进制格式显示变量,出现以下表示正常:
[root@localhost ~]# gdb -p $pid -x gdb-commands # 出现以下表示没问题: Inferior 1 [process 1214] will be detached. Quit anyway? (y or n) [answered Y; input not from terminal] [Inferior 1 (process 1214) detached]
- 查看我们获取到的文件,文件会以mem_*开头(注意这里的文件是二进制文件):
[root@localhost ~]# grep worker_connections mem_* 匹配到二进制文件 mem_0182d000
- 获取需要使用恢复的文件:
[root@localhost ~]# grep server_name mem_* 匹配到二进制文件 mem_0182d000 匹配到二进制文件 mem_7ffc14f4c000
可以看到有两份文件,因为是二进制文件,需要导出我们自己的电脑里(windows),然后我们使用Visual Studio Code软件,在Visual Studio Code软件找到商店搜索hexdump 并安装。
- 在自己的windows中安装hexdump工具
安装步骤:略...
因为是二进制文件,所以需要使用hexdump工具打开,选择查看方式:Show Hexdump
- 以下是在二进制文件在Visual Studio Code查看到的信息
00008440: 75 73 65 72 00 77 77 77 00 77 6F 72 6B 65 72 5F user.www.worker_ 00008450: 70 72 6F 63 65 73 73 65 73 00 61 75 74 6F 00 65 processes.auto.e 00008460: 72 72 6F 72 5F 6C 6F 67 00 6C 6F 67 73 2F 65 72 rror_log.logs/er 00008470: 72 6F 72 2E 6C 6F 67 00 2F 6F 70 74 2F 61 73 70 ror.log./opt/asp 00008480: 69 72 65 2F 70 72 6F 64 75 63 74 2F 6E 67 69 6E ire/product/ngin 00008490: 78 2F 6C 6F 67 73 2F 65 72 72 6F 72 2E 6C 6F 67 x/logs/error.log 000084a0: 00 65 76 65 6E 74 73 00 B0 54 83 01 00 00 00 00 .events.0T...... 000084b0: C0 54 83 01 00 00 00 00 F0 54 83 01 00 00 00 00 @T......pT...... 000084c0: 00 90 01 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 000084d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000084e0: F4 01 00 00 00 00 00 00 D5 80 49 00 00 00 00 00 t.......U.I..... 000084f0: 00 02 00 00 00 00 00 00 20 00 00 00 00 00 00 00 ................ 00008500: 75 73 65 00 65 70 6F 6C 6C 00 77 6F 72 6B 65 72 use.epoll.worker 00008510: 5F 63 6F 6E 6E 65 63 74 69 6F 6E 73 00 31 30 32 _connections.102 00008520: 34 30 30 00 68 74 74 70 00 26 F6 FC B1 36 BA 9E 400.http.&v|16:. 00008530: 48 55 83 01 00 00 00 00 A0 56 83 01 00 00 00 00 HU.......V...... 00008540: F8 57 83 01 00 00 00 00 50 59 83 01 00 00 00 00 xW......PY...... 00008550: 68 5F 83 01 00 00 00 00 68 62 83 01 00 00 00 00 h_......hb......
我们可以查看自己觉得很重要的信息(注意:这里一定 要仔细看)
- 以下是笔者的nginx配置文件信息,经与上图对比,配置信息都存在。
user www; worker_processes auto; error_log logs/error.log; events { use epoll; worker_connections 102400; } ... ... ...
经过不断的折腾,到此为止,nginx的配置文件算是恢复了,笔者只在这里看一小部分内容。至此,笔者今晚时间有限,就此搁笔,希望大家多多关注、支持、点赞、转发。