Süreci nginx config çalışan işlemden?


42

Görünüşe göre uykusuz geceyi bir uygulamanın hatalarını ayıklamak için harcamamalıydım. Nginx'imi yeniden başlatmak istedim ve config dosyasının boş olduğunu keşfettim. Kesmeyi hatırlamıyorum ama şişman parmaklar ve dikkatin azalması muhtemelen rol oynadı.

Bu yapılandırma dosyasının yedeğim yok. Bunu yapmam gerektiğini biliyorum.

Benim için iyi, mevcut nginx daemon hala çalışıyor. Yapılandırmasını daha sonra anlayacağı bir yapılandırma dosyasına dökmenin bir yolu var mı?

Yanıtlar:


53

Çalışan işlemin bellek bölgelerini boşaltmak için yüklü bir gdb'ye ihtiyacınız var.

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

"İkili dosya mem_086cb000 eşleşiyor" gibi bir şey edinmelisiniz. Bu dosyayı editörde açın, config (örn. "Worker_connections" direktifini) arayın, kopyalayın ve yapıştırın. Kar!

Güncelleme: Bu yöntem tamamen güvenilir değil. Nginx işleminin konfigürasyonu okuyacağı ve daha sonra bu bellek alanını üzerine yazma / tekrar kullanmadığı varsayımına dayanmaktadır. Usta nginx süreci bize bunun için en iyi şansı veriyor.


2
Teşekkürler, ama bu benim için çok zor. Config dosyasını sıfırdan yeniden yazacağım :)
Sergio Tulentsev

1
Bir mmap'd dosyası bir ope dosya askısı anlamına gelir. Birini kurtarmanın daha kolay bir yoluna bakın: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx yapılandırma dosyası için fd'yi açık tutmaz.
kupson

Evet, çoğu uygulama ... bahsettiğimden sonra yorumumu düzenlediğimi düşündü. Hata.
Jeff Ferland,

1
Bu çok sert geliyor! Artık resmen bir bilgisayar korsanıyım. Yapılandırmalarınızı geri bulmak için hafıza okuma. @Kupson
adriaan 14:23

12

Bu, bu talebe yardımcı olmaz, ancak aynı sebeple buraya ulaşan başkalarına da yardımcı olabilir. Daha yeni nginx sürümleri , bellekten değil tüm nginx yapılandırma dosyalarından okunan nginx config'i boşaltmak için -T seçeneğine sahiptir :

nginx -T

Bu, bir yapılandırma dosyasının okunduğunu onaylamak, diğer sunucularla karşılaştırmak veya yapılandırmaları aramak için yararlı olabilir.

Yine, bu yapılandırma işlemini çalışan işlemden atmayacaktır , sadece yeni bir işlem ne yükleyecektir.


2

Ngx_conf_t, yapılandırma ayrıştırması için kullanılan bir yapı türüdür. Yapılandırma ayrıştırma sırasında yalnızca var ve yapılandırma ayrıştırma tamamlandıktan sonra açıkçası erişemiyorsunuz.


2
'Açıkçası' erişilemez çünkü görünüşe göre nginx'te böyle bir tesis uygulanmamıştır; diğer programlar postconf -nPostfix veya exim -bPExim veya testparm -vSamba için (kötü şekilde adlandırılmış) vs. gibi olanaklara sahiptir
Josip Rodin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.