worker_processes *;

本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息。

问题背景

假设 /etc/nginx/site-available 下有 a.example.com.conf、b.example.com.conf 两个配置文件,用于对两个域名做代理。

当不小心拷贝了以下数据,粘贴后习惯性的敲了回车键,由于命令中包含了重定向命令 "->",会直接覆盖文件,从而导致数据全部丢失。

 
image

下面做个简单测试,创建文件test;

执行命令 a.example.com.conf -> test

由于普通文本中带有 -> test,虽然报了命令没找到,但 -> test 还是执行了,导致 test 文件数据被清空。

[root@centos]echo hello > test

[root@centos]# a.example.com.conf -> test
-bash: a.example.com.conf: 未找到命令

恢复配置

恢复思路是看Nginx进程的内存中有没有存储配置信息,如果有那能不能dump出来。一搜还真有,文章 Dump Current Nginx Config 提供了个小脚本 dump.sh,这个脚本需要 GDB: The GNU Project Debugger 工具的支持。

yum install gdb 安装gdb之后,找到Nginx master的进程ID,然后执行下面命令即可。

# Set pid of nginx master process here
pid=339 # 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_*

/proc/$pid/maps 文件包含了当前进程内存映射区域和访问权限信息,下面是部分样例数据。

 
image

最后 grep server_name mem_* 命令输出了包含 server_name 的文件。

[root@centos]# grep server_name mem_*
匹配到二进制文件 mem_558f03f58000
匹配到二进制文件 mem_558f0416f000

下载文件之后,用 Visual Studio Code (由于是二进制文件,不要用sublime之类的打开,会是乱码)打开,全局检索一下,以我的博客为例,就能看到熟悉的配置信息了。

 
image

将配置拷贝出来恢复nginx即可。

小结

本文介绍了一种利用Nginx的内存恢复数据的方式,虽然代理层问题不像DB数据问题那样致命,但影响也非常大。因此,除了关注数据安全之外,对于配置类的信息也要做好备份和版本管理。

作者:码代码的陈同学
链接:https://www.jianshu.com/p/1678b26fb98c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最新文章

  1. android 连接蓝牙扫码枪,程序崩溃之onConfigurationChanged
  2. Effective Java 01 Consider static factory methods instead of constructors
  3. 【读书笔记】读《JavaScript设计模式》之门面模式
  4. Java线程同步和线程通信
  5. Redis和Memcache的对比
  6. Android WebView的loadData方法注意事项
  7. 转载的别人的ajax跨域解决方法
  8. poj3708:函数式化简+高精度进制转换+同余方程组
  9. org.springframework.core.io包内的源码分析
  10. iOS开发支付集成之支付宝支付
  11. windows 2008 开机启动 Docker Toolbox 并运行容器
  12. MySQL主从复制(一)
  13. Ubuntu如何启用root用户登录
  14. 【转载】Java性能优化之JVM GC(垃圾回收机制)
  15. 裸奔的智能插座:博联Broadlink SP2/SP mini的分析、破解
  16. QT数据类型
  17. LeetCode 6. ZigZag Conversion & 字符串
  18. springMVC源码分析--HttpMessageConverter写write操作(三)
  19. sort_contours_xld算子的几种排序方式研究
  20. Schema validation found non-datatype errors

热门文章

  1. Computer Vision_33_SIFT:A novel coarse-to-fine scheme for automatic image registration based on SIFT and mutual information——2014
  2. Android笔记(十五) Android中的基本组件——单选框和复选框
  3. Set的交集、差集踩坑记录
  4. linux网络编程之socket编程(七)
  5. FontLab
  6. Caused by: java.lang.ClassNotFoundException: org.fusesource.jansi.WindowsAnsiOutputStream
  7. 容器上使用Docker还是Rocket?为什么不一起用呢?
  8. 23 export default和export的使用方式
  9. Jquery Ajax跨域访问
  10. clean()方法的简单应用