चलने की प्रक्रिया से डंप nginx विन्यास?


42

जाहिर है, मैं एक आवेदन डिबग करने की कोशिश कर रात की नींद हराम खर्च नहीं करना चाहिए था। मैं अपने 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_*

आपको "बाइनरी फ़ाइल मेम_086cb000 मैचों" जैसा कुछ मिलना चाहिए। इस फाइल को संपादक में खोलें, कॉन्फिगर की खोज करें (उदाहरण के लिए "कार्यकर्ता_कनेक्ट" निर्देश), कॉपी और पेस्ट करें। फायदा!

अद्यतन: यह विधि पूरी तरह से विश्वसनीय नहीं है। यह इस धारणा पर आधारित है कि nginx प्रक्रिया कॉन्फ़िगरेशन को पढ़ेगी और इस मेमोरी क्षेत्र को बाद में अधिलेखित / पुन: उपयोग नहीं करेगी। मास्टर नगीनेक्स प्रक्रिया हमें इसके लिए सबसे अच्छा मौका देती है जो मुझे लगता है।


2
धन्यवाद, लेकिन यह मेरे लिए बहुत कट्टर है। मैं स्क्रैच से कॉन्फिग फाइल को फिर से
लिखूंगा

1
एक mmap'd फ़ाइल एक ope फ़ाइलहैंड का अर्थ है। एक को पुनर्प्राप्त करने के लिए एक आसान तरीका देखें: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx कॉन्फ़िगरेशन फ़ाइल के लिए खुला fd नहीं रखें।
kupson

हाँ, अधिकांश अनुप्रयोग नहीं ... मैंने उल्लेख शामिल करने के बाद अपनी टिप्पणी संपादित की। उफ़।
जेफ फेरलैंड

1
यह बहुत कट्टर लगता है! मैं आधिकारिक तौर पर अब एक हैकर हूं। अपने कॉन्फिगर को वापस पाने के लिए मेमोरी पढ़ना। @Kupson समझाने के लिए धन्यवाद
adriaan

12

यह इस अनुरोध पर मदद नहीं करेगा, लेकिन अन्य कारणों से यहां तक ​​पहुंचने में मदद कर सकता है। नए nginx संस्करणों के पास -T का विकल्प है कि सभी nginx config फ़ाइलों से पढ़े गए nginx config को डंप करें , मेमोरी से नहीं:

nginx -T

यह पुष्टि करने के लिए उपयोगी हो सकता है कि एक कॉन्फ़िगरेशन फ़ाइल को पढ़ा जा रहा है, अन्य सर्वर के साथ तुलना करने या कॉन्फ़िगरेशन के लिए खोज करने के लिए।

फिर, यह चल रही प्रक्रिया से कॉन्फ़िगर को डंप नहीं करेगा , केवल एक नई प्रक्रिया लोड होगी।


2

Ngx_conf_t कॉन्फ़िगरेशन पार्सिंग के लिए उपयोग की जाने वाली संरचना का एक प्रकार है। यह केवल कॉन्फ़िगरेशन पार्सिंग के दौरान मौजूद है, और जाहिर है कि कॉन्फ़िगरेशन पार्सिंग पूर्ण होने के बाद आप इसे एक्सेस नहीं कर सकते।


2
यह 'स्पष्ट रूप से' दुर्गम है क्योंकि स्पष्ट रूप से ऐसी कोई सुविधा नहीं है जिसे नगनेक्स में लागू किया गया है; अन्य कार्यक्रमों में ऐसी सुविधाएं हैं, जैसे कि postconf -nपोस्टफिक्स के लिए या exim -bPएक्ज़िम के लिए या (बुरी तरह से नामित) testparm -vसांबा के लिए, आदि
जोसिप रॉडिन

0

आदर्श तरीका यह है कि ngx_conf_tnginx प्रक्रिया छवि से संरचना को देखें।

इसे यहाँ परिभाषित किया गया है

http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166

मेरा C & gdb चूसता है ताकि घर में कोई और एक समाधान के साथ आ सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.