Nginx配置信息損毀又無備份時如何恢復

歡迎訪問陳同學博客原文

本文介紹在Nginx配置信息出現問題後,在沒有備份的情況下,如何利用Nginx進程的虛擬內存恢復配置信息。

問題背景

假設 /etc/nginx/site-available 下有 a.example.com.conf、b.example.com.conf 兩個配置文件,用於對兩個域名做代理。

當不小心拷貝了以下數據,粘貼後習慣性的敲了回車鍵,由於命令中包含了重定向命令 “->”,會直接覆蓋文件,從而導致數據全部丟失。

下面做個簡單測試,創建文件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 文件包含了當前進程內存映射區域和訪問權限信息,下面是部分樣例數據。

最後 grep server_name mem_* 命令輸出了包含 server_name 的文件。

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

下載文件之後,用 Visual Studio Code (由於是二進制文件,不要用sublime之類的打開,會是亂碼)打開,全局檢索一下,以我的博客爲例,就能看到熟悉的配置信息了。

將配置拷貝出來恢復nginx即可。

小結

本文介紹了一種利用Nginx的內存恢復數據的方式,雖然代理層問題不像DB數據問題那樣致命,但影響也非常大。因此,除了關注數據安全之外,對於配置類的信息也要做好備份和版本管理。


歡迎關注公衆號 [陳一樂],一起學習,一起成長

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章