実行中のプロセスからnginxの設定をダンプしますか?


42

どうやら、アプリケーションをデバッグしようとして眠れぬ夜を過ごすべきではなかったようです。私はnginxを再起動したかったのですが、その設定ファイルが空であることを発見しました。私はそれを切り捨てたのを覚えていませんが、太った指と注意力の低下がおそらくその役割を果たしました。

その構成ファイルのバックアップはありません。私はそれを作るべきだったと知っています。

私にとっては、現在のnginxデーモンはまだ実行中です。構成ファイルに構成をダンプする方法はありますか?

回答:


53

実行中のプロセスのメモリ領域をダンプするには、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プロセスは、そのための最良のチャンスを与えてくれます。


2
感謝しますが、これは私にとって筋金入りです。構成ファイルを最初から書き直します:)
Sergio Tulentsev

1
mmap'dファイルは、opeファイルハンドルを意味します。1つを回復する簡単な方法を参照してください:serverfault.com/questions/45237/link-to-a-specific-inode
ジェフファーランド

@JeffFerland nginxは、設定ファイルのfdを開いたままにしません。
クプソン

ええ、ほとんどのアプリケーションでは、言及を含めるためにコメントを編集したとは思いません。おっと。
ジェフファーランド

1
これはとてもハードな感じです!私は公式にハッカーになりました。メモリを読み出して、構成を見つけます。@kupsonをご説明いただきありがとうございます
アドリアーン

12

これはこのリクエストには役立ちませんが、同じ理由で他のユーザーがここに到達するのに役立つ場合があります。新しいnginxバージョンには、メモリからではなく、すべてのnginx構成ファイルから読み取ったnginx構成をダンプする-Tオプションがあります。

nginx -T

これは、構成ファイルが読み取られていることを確認したり、他のサーバーと比較したり、構成を検索したりするのに役立ちます。

繰り返しますが、これは実行中のプロセスから設定をダンプせず、新しいプロセスがロードするもののみをダンプします。


2

ngx_conf_tは、構成の解析に使用される構造体のタイプです。これは、構成の解析中にのみ存在し、構成の解析が完了した後は明らかにアクセスできません。


2
nginxにはこのような機能が実装されていないように見えるため、「明らかに」アクセスできません。他のプログラムにはpostconf -n、Postfixやexim -bPExim testparm -v、Sambaなどの(悪名)のような機能があります。
JosipRodin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.