從執行中的nginx 中找到nginx.conf

spectre2發表於2015-10-12
最近生產環境中的一個nginx的配置檔案被誤覆蓋了(刪除還能恢復,覆蓋恢復太困難了),google了一下,有從/proc中
dump mem 的方式,不能說完全恢復,但是全部執行的server_name都能找到,附上作者原話:

You should get something like "Binary file mem_086cb000 matches". Open this file in editor, search for config (e.g. "worker_connections" directive), copy&paste. Profit!

Update: This method isn't entirely reliable. It's based on assumption that nginx process will read configuration and don't overwrite/reuse this memory area later. Master nginx process gives us best chances for that I guess.

大意是:你應該得到一些像 “mem_086cb000” 類似的二進位制檔案 。在編輯器中開啟這個檔案,搜尋配置(例如“worker_connections”指令),複製和貼上。

更新:這個方法並不完全可靠。它是基於:假設nginx在執行過程中會讀取配置和不覆蓋/不再利用該儲存區。我想這是主nginx的程式中給了我們最好的機會。
方法如下(希望能幫到有需要的人):
找到執行中的nginx主程式號
# Set pid of nginx master process here
pid=8192

# 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_*

然後用vi或vim開啟這個mem_*檔案查詢server_name即可。
另外可以用vi -b mem_* 開啟,再用:%!xxd  轉換成16進位制,查詢server_name即可。
比較方便的是下載到本地,用一下二進位制閱讀工具來搜尋檢視,會友好一些。

From: http://serverfault.com/questions/361421/dump-nginx-config-from-running-process/436239

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14184018/viewspace-1813800/,如需轉載,請註明出處,否則將追究法律責任。

相關文章