Dump nginx config dari proses yang sedang berjalan?


42

Rupanya, saya seharusnya tidak menghabiskan malam tanpa tidur mencoba men-debug aplikasi. Saya ingin me-restart nginx saya dan menemukan bahwa file konfigurasinya kosong. Saya tidak ingat memotongnya, tetapi jari-jari yang gemuk dan sedikit perhatian mungkin memainkan peran mereka.

Saya tidak punya cadangan file konfigurasi itu. Saya tahu saya seharusnya berhasil.

Baik untuk saya, daemon nginx saat ini masih berjalan. Apakah ada cara untuk membuang konfigurasinya ke file config yang akan dimengerti nanti?

Jawaban:


53

Anda memerlukan gdb yang diinstal untuk membuang wilayah memori dari proses yang sedang berjalan.

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

Anda harus mendapatkan sesuatu seperti "File biner mem_086cb000 cocok". Buka file ini di editor, cari config (mis. Direktif "worker_connections"), salin & tempel. Keuntungan!

Pembaruan: Metode ini tidak sepenuhnya dapat diandalkan. Ini didasarkan pada asumsi bahwa proses nginx akan membaca konfigurasi dan tidak menimpa / menggunakan kembali area memori ini nanti. Proses Master nginx memberi kita peluang terbaik untuk itu, kurasa.


2
Terima kasih, tapi ini terlalu hardcore untukku. Saya akan menulis ulang file konfigurasi dari awal :)
Sergio Tulentsev

1
File mmap menyiratkan ope filehandle. Lihat cara yang lebih mudah untuk memulihkannya: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx tidak membuka fd untuk file konfigurasi.
kupson

Ya, sebagian besar aplikasi tidak ... mengira saya mengedit komentar saya setelah memasukkan menyebutkan. Ups.
Jeff Ferland

1
Ini terasa sangat hardcore! Saya secara resmi seorang hacker sekarang. Membacakan memori untuk menemukan konfigurasi Anda kembali. Terima kasih telah menjelaskan @kupson
adriaan

12

Ini tidak akan membantu permintaan ini, tetapi mungkin membantu orang lain untuk mencapai sini karena alasan yang sama. Versi nginx yang lebih baru memiliki opsi -T untuk membuang nginx config read dari semua file nginx config , bukan dari memori:

nginx -T

Ini dapat berguna untuk mengkonfirmasi bahwa file konfigurasi sedang dibaca, untuk dibandingkan dengan server lain atau mencari konfigurasi.

Sekali lagi, ini tidak akan membuang konfigurasi dari proses yang berjalan , hanya proses baru yang akan dimuat.


2

Ngx_conf_t adalah jenis struktur yang digunakan untuk parsing konfigurasi. Ini hanya ada selama parsing konfigurasi, dan jelas Anda tidak dapat mengaksesnya setelah parsing konfigurasi selesai.


2
Ini 'jelas' tidak dapat diakses hanya karena ternyata tidak ada fasilitas seperti itu diimplementasikan di nginx; program lain memiliki fasilitas seperti itu, seperti postconf -nuntuk Postfix atau exim -bPuntuk Exim atau (nama buruk) testparm -vuntuk Samba, dll.
Josip Rodin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.