मैं अपस्ट्रीम सर्वर टाइमआउट पर PUT या POST अनुरोधों को फिर से करने से nginx को कैसे रोक सकता हूं?


11

हम अपने एप्लिकेशन में बैलेंस रिक्वेस्ट लोड करने के लिए nginx का उपयोग कर रहे हैं। हमने पाया है कि जब समय बाहर (अच्छा) का अनुरोध करता है, तो निगनेक्स एक अलग अपस्ट्रीम सर्वर पर स्विच करता है। हालाँकि, यह PUT और POST अनुरोधों के लिए ऐसा करता है जो अवांछनीय परिणाम (दो बार संग्रहीत डेटा) का कारण बन सकता है। क्या केवल समय पर GET के अनुरोधों को प्राप्त करने के लिए nginx को कॉन्फ़िगर करना संभव है? या समस्या को हल करने का एक और तरीका है?

हमारा विन्यास इस प्रकार है:

upstream mash {
    ip_hash;
    server 127.0.0.1:8081;
    server 192.168.0.11:8081;
}

server {
    ...
    location / {
        proxy_pass http://mash/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        
    }
}

जवाबों:


9

यह संस्करण 1.9.13 से शुरू होने वाला डिफ़ॉल्ट व्यवहार बन गया है

इसे मैन्युअल रूप से वापस बदलने के लिए आप इसका उपयोग कर सकते हैं:

proxy_next_upstream error timeout non_idempotent;

6

मुझे पता है कि मैं खेल में बहुत देर से आया हूं, लेकिन मेरे लिए इस समस्या को खोजते समय यह शीर्ष परिणाम है, इसलिए मैं अपना समाधान साझा करना चाहता था।

इस का उपयोग करता है, तो निर्देश (कुछ में से एक के साथ वैध उपयोग के मामलों के साथ संयुक्त) कस्टम त्रुटि हैंडलर :

upstream backend {
    server backend1;
    server backend2;
}

server {
    server_name proxy;

    location / {
        error_page 598 = @retry;
        error_page 599 = @no_retry;
        if ($request_method = POST) {
            return 599;
        }
        return 598;
    }

    location @retry {
        proxy_pass http://backend;
    }

    location @no_retry {
        proxy_pass http://backend;
        proxy_next_upstream off;
    }
}

4

कृपया यहाँ देखें: doc : xy_next_upstream

कृपया ध्यान दें कि यह एक अप्रशिक्षित जिस्ट है

https://gist.github.com/wojons/6154645


वास्तव में यह काम नहीं किया: Nginx का कहना है "प्रॉक्सी_नेक्स्ट_स्ट्रीम की अनुमति नहीं है"। मैंने कोशिश की कि यदि ब्लॉक लोकेशन में जाए और वही त्रुटि आए। "प्रॉक्सी_नेक्स्ट_अपस्ट्रीम एरर" का प्रयोग अपने कामों के लिए किसी भी स्थान पर करें।
डेविड टिंकर

यह बहुत अजीब है क्योंकि प्रलेखन स्पष्ट रूप से कहता है कि यह स्थान के संदर्भ में काम करता है
WojonsTech

ऐसा लगता है कि अगर (...) {} के आसपास प्रॉक्सी_नेक्स्ट_अपस्ट्रीम कि nginx पसंद नहीं है
डेविड टिंकर

क्या किसी ने इसका परीक्षण किया है? 4 अपवोट्स लेकिन यह मान्य उपयोग के मामलों का पालन करने के लिए प्रतीत नहीं होता है: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM

0

proxy_methodनिर्देश का उपयोग करें

इसके लिए देखें: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method


2
आम तौर पर आपके उत्तर में एक लिंक से उपयोगी जानकारी को शामिल करने की सिफारिश की जाती है, ताकि यह स्पष्ट रूप से उपयोगी होने के लिए लिंक पर भरोसा न करे
BE77Y

1
सर्वर दोष में आपका स्वागत है! जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
मार्क हेंडरसन

-1

मैं अपने tomcat सर्वर में एक ही समस्या है। लंबी रिक्वेस्ट आने पर प्रॉक्सी टाइम। मैंने अपनी समस्या को प्रॉक्सी_ड्रेड / टाइमआउट का उपयोग करके हल किया। जब टाइमआउट में वृद्धि होती है तो मेरा अनुरोध कभी भी समाप्त नहीं होता है और कोई समस्या नहीं हुई है। डिफ़ॉल्ट समय 60 से। संदर्भ

location / {
    proxy_pass  http://xxxxxxxxxx.com;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect off;
            proxy_connect_timeout      800;
            proxy_send_timeout         800;
            proxy_read_timeout         240;     
}

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