मैं त्रुटि लॉग से आगे nginx को कैसे डिबग कर सकता हूं?


34

मैं वर्तमान में काफी बड़ी HTTP बाढ़ प्राप्त कर रहा हूं, और यह 502 खराब गेटवे का निर्माण करने के लिए मेरे nginx रिवर्स प्रॉक्सी का कारण बन रहा है।

मेरे पास एक बैकेंड सर्वर है जो मेरे बैकएंड सर्वर के प्रॉक्सी के रूप में nginx चला रहा है, लेकिन यह सिर्फ connect() failed (110: Connection timed out) while connecting to upstreamत्रुटियों का एक गुच्छा है । उनमें से टन। यदि मैं बैकएंड से कनेक्ट करने के लिए प्रॉक्सी सर्वर को बायपास करता हूं, तो मैं साइट को ठीक से चला सकता हूं, इसलिए मुझे पता है कि कहीं यह रिवर्स प्रॉक्सी में है। हालांकि, मुझे पता नहीं है कि यह कैसे निर्धारित किया जाए कि यह समय समाप्त हो रहा है।

कोई मदद?

CentOS 6.2 पर nginx 1.2.3 चल रहा है


आप नवीनतम संस्करण में Nginx को अपडेट करके शुरू कर सकते हैं। यद्यपि, मैं 1.2.3 में ऐसे बग से अवगत नहीं हूँ
बेन लेसानी - सोनासी

2
.... और फिर एनजीआईएनएक्स से
सिम्बियन

आपका बैकेंड सर्वर क्या है? मैं त्रुटियों से पहले भ्रमित हो चुका हूं जब त्रुटि Nginx की सेवा कर रही थी वास्तव में बैकएंड से आ रही थी। यहां मामला नहीं लगता है, लेकिन आपको अधिक विवरण के साथ अपने प्रश्न को अपडेट करने की आवश्यकता है।
जेफेट्रैकैड

इसके अलावा, क्या आप बैकएंड पर एक निजी / सार्वजनिक नेटवर्क से जुड़ रहे हैं? किसी भी फ़ायरवॉल, ddos, या अन्य आईपी / दर-सीमित प्रकार के टूल में प्रॉक्सी के आईपी को श्वेतसूची में रखा गया है? बैकएंड सर्वर पर नेटस्टैट कैसा दिखता है? कितने कनेक्शन खुले हैं? बैकएंड पर MaxClients क्या है? क्या आप उन्हें थका रहे हैं?
jeffatrackaid

जवाबों:


19

मुझे लगता है कि आप पहले से ही डिबग करने के लिए अपने Nginx त्रुटि लॉगिंग स्तर jacked है। यदि नहीं, तो वहाँ शुरू करें।

आपकी सबसे अच्छी शर्त शायद straceनगीनेक्स द्वारा किए जा रहे सिस्टम कॉल को देखने के लिए उपयोग की जाने वाली है। विशेष रूप से, आप connect()कॉल पर ध्यान देना चाहेंगे , और इनमें से रिटर्न कोड पर नज़र रख man 2 connectसकते हैं ( यहाँ आपका दोस्त बन सकता है)।

एक बार जब आपके पास वह जानकारी हो जाती है, तो आप इस बारे में एक शिक्षित अनुमान लगा सकते हैं कि क्या समस्या आपके सामने वाले प्रॉक्सी तक सीमित है, या प्रॉक्सी और बैकएंड एप्लिकेशन सर्वर के बीच बातचीत के साथ कुछ करना है।


37

जब तक आप डीट्रेस प्रोब में नहीं डालना चाहते हैं, तब तक इससे अधिक पांडित्य नहीं मिलता है:

  1. डीबग लॉग स्तर सेट करें: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. दूसरी विंडो में सेटअप tcpdump:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. लॉग फ़ाइलों को अभी तक किसी अन्य विंडो में मॉनिटर करें:

    tail -f /var/log/nginx/*
    
  4. स्ट्रेप के साथ अंतर्जाल की शुरुआत

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    और तब

     $ strace nginx 
    

आगे डिबगिंग एक नगीने के साथ संकलित किया जा सकता है --with-debug। इसे चलाकर जांचें:

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

एक और अच्छा मॉड्यूल डिफ़ॉल्ट रूप से संकलित नहीं है: HttpStubStatusModule । सभी संभावना में, किसी भी सभ्य सेटअप को कस्टम-संकलित नेग्नेक्स की आवश्यकता होगी (डिस्ट्रो के पैकेजिंग टूल का उपयोग करके अत्यधिक-अनुशंसित पैकेजिंग)।

इनमें से अधिकांश उत्पादन के उपयोग के लिए अनुपयुक्त हैं, यदि आपको अधिक आँकड़ों की आवश्यकता है तो nperx को gperf के साथ संकलित करें।


चरण 2 में, मेरे लिए निम्नलिखित काम करता है: tcpdump -i कोई भी पोर्ट नहीं -vvv -s0 -q -XXX
ccppjava

5

ऐसा लगता है कि आप किसी उच्च ट्रैफ़िक साइट पर डिबगिंग कर रहे हैं।

निर्देश के debugसाथ प्रयोग करें debug_connectionइसलिए nginx त्रुटि लॉग आपके IP से केवल डीबग लॉग दिखाएगा।

एक बार जब आप पूरे nginx config के लिए डिबग विकल्प को सक्रिय करने के बजाय कुछ उपयोगी त्रुटि लॉग देखना शुरू करते हैं, तो रिवर्स_प्रोक्सी कनेक्शन के लिए जिम्मेदार ब्लॉक error_log /path/to/some/file/ debug;में एक अलग निर्देश जोड़ें location {..}

इस तरह आप डीबग एरर लॉग को केवल अपने आईपी से अलग कर पाएंगे।

आपके द्वारा (आपके ब्राउज़र से) किए जा रहे अनुरोध से इसे संबंधित करने का प्रयास करें।

उदाहरण के लिए, कृपया देखें: https://easyengine.io/tutorials/nginx/debugging/

एक स्तर आगे, आप Nginx के HttpEchoModule का उपयोग कर सकते हैं


2

मैंने कभी भी नग्नेक्स को एक अड़चन नहीं पाया है, ज्यादातर मामलों में यह पीठ के सिरों से अधिक सक्षम है। लेकिन अगर आपने बिना नग्नेक्स का परीक्षण किया और कोई त्रुटि नहीं पाई, तो इसका या तो (या दोनों) होने वाला है:

  1. Nginx कॉन्फ़िगरेशन समस्या
    1. अपस्ट्रीम टाइम आउट मूल्य गलत
    2. अपस्ट्रीम पर गलत जांच URL
    3. बहुत कम कार्यकर्ता
    4. आदि।
  2. ऑपरेटिंग सिस्टम टीसीपी / आईपी अड़चन
    1. यह हो सकता है कि समीपवर्ती ही खुले बंदरगाहों और राज्यों के दोहराव का कारण बन रहा है। यह डिस्क्रिप्टर, पोर्ट, टीसीपी कनेक्शन फाइल करें

आपके Nginx कॉन्फ़िगरेशन को देखे बिना, कोई भी पूर्व पर टिप्पणी नहीं कर सकता है। और ओएस से उपयुक्त आउटपुट के बिना, कोई भी उत्तरार्द्ध पर टिप्पणी नहीं कर सकता है।

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