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資料問題那樣致命,但影響也非常大。因此,除了關注資料安全之外,對於配置類的資訊也要做好備份和版本管理。