背景#
自社のコンポーネントページをメンテナンスする際、便宜上サーバーで直接デバッグするための Nginx.conf を調整しました。
やっと調整がほぼ完了し、Nginx も起動しましたが、いつもの癖で一部の一時ファイルを削除しようとしました。
しかし、手が滑って rm -rf nginx* と入力してしまい、サーバーの Nginx の設定などがすべて削除されてしまいました。
しかも、ローカルにもバックアップもなく、GIT にもプッシュしていませんでした。
幸いにもオンライン上には有識者がいて、なんとか元に戻すことができました。ここに記録しておきます。
実践手順#
- yum install gdb を実行して gdb をインストールし、Nginx のマスタープロセスのプロセス ID を見つけます。
- 以下のコマンドを実行します。
# ここにNginxのマスタープロセスのpidを設定してください
pid=339
# awkを使用してプロセスのメモリマッピングからgdbコマンドを生成します
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
# -xオプションを使用してこれらのメモリ領域をmem_*ファイルにダンプするためにgdbを使用します
gdb -p $pid -x gdb-commands
# nginx.confのテキストを検索します
grep worker_connections mem_*
grep server_name mem_*
- 最後に、grep server_name mem_* コマンドで server_name を含むファイルが出力されます。
[root@centos]# grep server_name mem_*
二進数ファイル mem_558f03f58000 に一致しました
二進数ファイル mem_558f0416f000 に一致しました
- ファイルをダウンロードした後、Visual Studio Code(バイナリファイルなので、sublime などでは開かないでください。文字化けします)を使用して、グローバル検索を実行すると、慣れ親しんだ設定情報が表示されます。
- ファイルの開始位置はおおよそ http { の位置で特定できます。
6. 直接コピー&ペーストはできませんが、何とか元に戻すことができました。自分が手が滑ったせいです QAQ