どうやら、アプリケーションをデバッグしようとして眠れぬ夜を過ごすべきではなかったようです。私はnginxを再起動したかったのですが、その設定ファイルが空であることを発見しました。私はそれを切り捨てたのを覚えていませんが、太った指と注意力の低下がおそらくその役割を果たしました。
その構成ファイルのバックアップはありません。私はそれを作るべきだったと知っています。
私にとっては、現在のnginxデーモンはまだ実行中です。構成ファイルに構成をダンプする方法はありますか?
どうやら、アプリケーションをデバッグしようとして眠れぬ夜を過ごすべきではなかったようです。私はnginxを再起動したかったのですが、その設定ファイルが空であることを発見しました。私はそれを切り捨てたのを覚えていませんが、太った指と注意力の低下がおそらくその役割を果たしました。
その構成ファイルのバックアップはありません。私はそれを作るべきだったと知っています。
私にとっては、現在のnginxデーモンはまだ実行中です。構成ファイルに構成をダンプする方法はありますか?
回答:
実行中のプロセスのメモリ領域をダンプするには、gdbをインストールする必要があります。
# 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_*
「バイナリファイルmem_086cb000一致」のようなものを取得する必要があります。このファイルをエディターで開き、設定(「worker_connections」ディレクティブなど)を検索して、コピーして貼り付けます。利益!
更新:この方法は完全に信頼できるものではありません。これは、nginxプロセスが設定を読み取り、後でこのメモリ領域を上書き/再利用しないという仮定に基づいています。マスターnginxプロセスは、そのための最良のチャンスを与えてくれます。
ngx_conf_tは、構成の解析に使用される構造体のタイプです。これは、構成の解析中にのみ存在し、構成の解析が完了した後は明らかにアクセスできません。
postconf -n
、Postfixやexim -bP
Exim testparm -v
、Sambaなどの(悪名)のような機能があります。
理想的な方法はngx_conf_t
、nginxプロセスイメージから構造体を探すことです。
ここで定義されています
http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166
私のCとgdbは、他の誰かが解決策を思い付くことができるように吸います。