当误删nginx配置文件,而又没备份的时候,该怎么办?

简介: 当误删nginx配置文件,而又没备份的时候,该怎么办?

今天在测试环境,手贱误删nginx配置文件,但又没有备份,吓得我赶紧抽根烟冷静冷静,当冷静下来之后,思索着怎么办?因为我人懒,不想重新搭建测试环境。接下来...

注意:在这个时候千万不要杀掉nginx进程,只要进程在运行就好办,不然nginx的配置文件就无法恢复了。

恢复思路

  • 经过笔者的头脑风暴,最重要的两个恢复步骤:
  1. 从加载到内存中的Nginx进程入手,找出加载在内存中的配置文件
  2. 通过gdb命令对配置文件进行解析和导出到本WIN环境
  3. 在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。

正式开干!依次按下面的步骤进行恢复

注意:下面所执行命令后生成的文件都会在当前目下。

  1. 在命令行执行:
[root@localhost ~]# pid=7879 #(nginx master的IP)
  1. 敲回车输入以下命令:
[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
  1. 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]
  1. 查看我们获取到的文件,文件会以mem_*开头(注意这里的文件是二进制文件):
[root@localhost ~]# grep worker_connections mem_*
匹配到二进制文件 mem_0182d000
  1. 获取需要使用恢复的文件:
[root@localhost ~]# grep server_name mem_*
匹配到二进制文件 mem_0182d000
匹配到二进制文件 mem_7ffc14f4c000

可以看到有两份文件,因为是二进制文件,需要导出我们自己的电脑里(windows),然后我们使用Visual Studio Code软件,在Visual Studio Code软件找到商店搜索hexdump 并安装。

  1. 在自己的windows中安装hexdump工具

安装步骤:略...

因为是二进制文件,所以需要使用hexdump工具打开,选择查看方式:Show Hexdump

  1. 以下是在二进制文件在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......

我们可以查看自己觉得很重要的信息(注意:这里一定 要仔细看)

  1. 以下是笔者的nginx配置文件信息,经与上图对比,配置信息都存在。
user www;
      worker_processes auto;
      error_log  logs/error.log;
      events {
          use epoll;
          worker_connections  102400;
      }
...
...
...

经过不断的折腾,到此为止,nginx的配置文件算是恢复了,笔者只在这里看一小部分内容。至此,笔者今晚时间有限,就此搁笔,希望大家多多关注、支持、点赞、转发。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
应用服务中间件 nginx
Nginx 配置文件详解
Nginx 配置文件详解
56 0
|
7月前
|
应用服务中间件 Linux nginx
Mac Nginx 配置文件使用(nginx.conf,包含M1)
Mac Nginx 配置文件使用(nginx.conf,包含M1)
280 0
|
6天前
|
Java 应用服务中间件 PHP
Nginx配置文件解释
Nginx配置文件解释
16 1
|
27天前
|
运维 应用服务中间件 Linux
LNMP详解(五)——Nginx主配置文件详解
LNMP详解(五)——Nginx主配置文件详解
18 1
|
1月前
|
负载均衡 应用服务中间件 nginx
|
7月前
|
应用服务中间件 nginx Docker
在 Docker 中部署 Nginx 并挂载配置文件
在 Docker 中部署 Nginx 并挂载配置文件
|
2月前
|
Ubuntu 应用服务中间件 nginx
ubuntu环境下 nginx 怎么配置文件
ubuntu环境下 nginx 怎么配置文件
|
3月前
|
负载均衡 NoSQL 应用服务中间件
Nginx编译安装及配置文件详解
Nginx编译安装及配置文件详解
|
8月前
|
运维 应用服务中间件 nginx
nginx--配置文件详解、错误页面的配置
nginx--配置文件详解、错误页面的配置
|
3月前
|
应用服务中间件 nginx
上传文件失败413 Request Entity Too Large,nginx配置文件大小的限制
上传文件失败413 Request Entity Too Large,nginx配置文件大小的限制