Nginx रिवर्स प्रॉक्सी के कारण 504 गेटवे टाइमआउट


129

मैं निगनेक्स को एक रिवर्स प्रॉक्सी के रूप में उपयोग कर रहा हूं जो अनुरोध लेता है फिर पोर्ट 8001 पर चल रहे अपस्ट्रीम सर्वर से वास्तविक वेब एप्लिकेशन प्राप्त करने के लिए एक प्रॉक्सी_पास करता है।

अगर मैं mywebsite.com पर जाता हूं या एक wget करता हूं, तो मुझे 60 सेकंड के बाद 504 गेटवे टाइमआउट मिल जाता है ... हालांकि, अगर मैं mywebsite.com:8001 को लोड करता हूं, तो एप्लिकेशन अपेक्षित रूप से लोड होता है!

तो कुछ Nginx को अपस्ट्रीम सर्वर के साथ संचार करने से रोक रहा है।

यह सब मेरी होस्टिंग कंपनी द्वारा मशीन को रीसेट करने के बाद शुरू हुआ था, जिस पर मेरा सामान चल रहा था, इससे पहले कि कोई समस्या नहीं थी।

यहाँ मेरा vhosts सर्वर ब्लॉक है:

server {
    listen   80;
    server_name mywebsite.com;

    root /home/user/public_html/mywebsite.com/public;

    access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
    error_log /home/user/public_html/mywebsite.com/log/error.log;

    location / {
        proxy_pass http://xxx.xxx.xxx.xxx:8001;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
} 

और मेरे Nginx त्रुटि लॉग से आउटपुट:

2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"

सर्वर SELinux चल रहा है?
क्रैकरजैक

MY CASE में, NAT गेटवे मुद्दा था, न कि NGINX या बैकएंड एपीआई। stackoverflow.com/a/62351959/9956279
सुशीलिनक्स

जवाबों:


152

संभवतः अपस्ट्रीम अवधि को बढ़ाने के लिए कुछ और लाइन जोड़ सकते हैं। नीचे दिए गए उदाहरण टाइमआउट को 300 सेकंड में सेट करते हैं:

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

5
मुझे लगता है कि समय-सीमा बढ़ाना शायद ही कभी जवाब दे जब तक आप नहीं जानते कि आपका नेटवर्क / सेवा हमेशा या कुछ मामलों में बहुत धीमी गति से प्रतिक्रिया करता है। जब तक आप सामग्री (फ़ाइलें / चित्र) डाउनलोड नहीं कर रहे हैं, तब तक कुछ वेब अनुरोधों को कुछ सेकंड से अधिक समय तक लेना चाहिए
Alm15

@ अलमुंड मैंने एक ही बात सोची (लगभग इसे आज़माने की जहमत नहीं की), लेकिन जिस भी कारण से यह मेरे लिए काम किया। (पहले 60 सेकंड के बाद समय समाप्त हो गया था, अब तुरंत प्रतिक्रिया प्राप्त करें)।
डैक्स फोहल

@ डैक्स फ़ोहल: यह उत्सुक है। मैंने स्रोत को नीचे खींच लिया था और एक त्वरित नज़र था और जो मैं देख सकता था, से किसी भी प्रॉक्सी_ सेटिंग को प्रॉक्सी_पास से अलग करना सेटिंग की एक गुच्छा को इनिशियलाइज़ कर देगा, जो मुझे लगता है कि प्रॉक्सी को एक अलग तरीके से चलाएगा इसलिए शायद कुछ भी सेट करने से यह समान होगा व्यवहार।
अल्लुंड

एक नोड सर्वर के साथ इसका उपयोग करके मेरे लिए समस्या को हल नहीं किया
vpx

3
मुझे लगता है कि मुझे केवल proxy_read_timeoutबैकएंड पर डिबगिंग की आवश्यकता है । धन्यवाद!
जेफ पकेट

79

जैसा कि आप कहते हैं, टाइमआउट बढ़ाने से संभवतः आपकी समस्या हल नहीं होगी, वास्तविक लक्ष्य वेब सर्वर ठीक जवाब दे रहा है।

मेरे पास यही मुद्दा था और मैंने पाया कि इसे कनेक्शन पर एक जीवित-उपयोग न करने के साथ करना था। मैं वास्तव में जवाब नहीं दे सकता कि यह क्यों है, लेकिन कनेक्शन हेडर को क्लियर करने में मैंने इस समस्या को हल किया और अनुरोध ठीक था।

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

इस पोस्ट पर एक नज़र डालें जो इसे और अधिक विस्तार से बताता है: अनुरोध के बाद nginx नज़दीकी अपस्ट्रीम कनेक्शन रखें। ज़िंदा हेडर स्पष्टीकरण http://nginx.org/en/docs/http/ngx_http_upstream_module=keepalive


7
एक लाइन proxy_set_header Connection "";लोल द्वारा हल की गई समस्याओं के कारण , रनक्लाउड का उपयोग न करें
22:57

22

user2540984 , साथ ही कई अन्य लोगों ने बताया है कि आप अपनी टाइमआउट सेटिंग्स को बढ़ाने की कोशिश कर सकते हैं। मैं खुद भी इसी तरह के मुद्दे का सामना कर चुका हूं और /etc/nginx/nginx.conf फ़ाइल में अपनी टाइमआउट सेटिंग्स बदलने की कोशिश करता हूं , जैसा कि इन थ्रेड्स में लगभग सभी लोग सुझाव देते हैं। हालाँकि, इससे मुझे एक भी मदद नहीं मिली; NGINX के टाइमआउट सेटिंग्स में कोई स्पष्ट परिवर्तन नहीं हुआ। कई घंटों की खोज के बाद, मैं आखिरकार अपने मुद्दे को हल करने में कामयाब रहा।

समाधान इस फ़ोरम थ्रेड में निहित है , और यह क्या कहता है कि आपको अपनी टाइमआउट सेटिंग्स /etc/nginx/conf.d/timeout.conf में डालनी चाहिए (और यदि यह फ़ाइल मौजूद नहीं है, तो आपको इसे बनाना चाहिए)। मैंने थ्रेड में सुझाए गए समान सेटिंग्स का उपयोग किया:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

यह आपकी विशेष समस्या का समाधान नहीं हो सकता है, लेकिन अगर किसी और ने नोटिस किया कि /etc/nginx/nginx.conf में समय समाप्त हो जाए तो कुछ भी न करें, मुझे आशा है कि यह उत्तर मदद करता है!


नमस्ते मेरे config.d निर्देशिका में कोई timeout.conf नहीं है। आपने कहा कि इसे बनाएं, और मैं पुष्टि करना चाहता हूं कि टाइमआउट.conf में उपरोक्त सेटिंग जोड़ें?
tktktk0711

हां, बस उन्हें जोड़ें। आप उन्हें अपनी आवश्यकताओं के लिए संशोधित कर सकते हैं, लेकिन ये मेरे लिए काम करते हैं!
एंड्रियास फोर्स्लोव

दुर्भाग्य से, लारवेल में ubuntu और Nginx के साथ होमस्टेड है, यह काम नहीं करता है। :( क्या आपका मतलब केवल उन पंक्तियों को जोड़ना है? बिना server{}या कुछ और? यह त्रुटि 5 मिनट के बाद सही निकलती है। मैं पुनः लोड करता हूं, रिबूट करता हूं, और यह कभी भी उन 5 मिनट या 300 सेकंड से परे नहीं बनाता है। क्या इसे ठीक करने के लिए अधिक विचार हैं। यह?
Pathros

15

यदि आप सभी साइटों पर समय सीमा बढ़ाना या जोड़ना चाहते हैं तो आप nginx.confफ़ाइल में नीचे की पंक्तियों को जोड़ सकते हैं ।

या फ़ाइल के httpअनुभाग में नीचे की पंक्तियों को जोड़ें ।/usr/local/etc/nginx/nginx.conf/etc/nginx/nginx.conf

fastcgi_read_timeout 600;
proxy_read_timeout 600;

यदि उपरोक्त पंक्तियाँ confफ़ाइल में मौजूद नहीं हैं, तो उन्हें जोड़ें, अन्यथा बढ़ाएँ fastcgi_read_timeoutऔर proxy_read_timeoutयह सुनिश्चित करने के लिए कि nginx और php-fpm ने टाइमआउट नहीं किया है।

केवल एक साइट के लिए समय सीमा बढ़ाने के लिए आप vim में संपादित कर सकते हैं /etc/nginx/sites-available/example.com

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
        fastcgi_pass  unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300; 
}

और इन पंक्तियों को जोड़ने के बाद nginx.conf, फिर nginx को पुनरारंभ करना न भूलें।

service php7-fpm reload 
service nginx reload

या, यदि आप वैलेट का उपयोग कर रहे हैं तो बस टाइप करें valet restart


1
मेरे लिए धन्यवाद काम करता है:fastcgi_read_timeout 600; proxy_read_timeout 600;
अलेजांद्रो

13

यदि आपका अपस्ट्रीम सर्वर एक डोमेन नाम का उपयोग करता है, तो आप इस स्थिति का भी सामना कर सकते हैं और इसका IP पता बदल जाता है (जैसे: आपका अपस्ट्रीम AWS इलास्टिक लोड बैलेंसर की ओर इशारा करता है)

समस्या यह है कि nginx एक बार आईपी पते को हल करेगा, और इसे बाद के अनुरोधों के लिए कैश किया जाएगा जब तक कि कॉन्फ़िगरेशन फिर से लोड न हो जाए।

एक बार कैश्ड प्रविष्टि समाप्त होने पर डोमेन को फिर से हल करने के लिए आप नाम सर्वर का उपयोग करने के लिए nginx बता सकते हैं :

location /mylocation {
    # use google dns to resolve host after IP cached expires
    resolver 8.8.8.8;
    set $upstream_endpoint http://your.backend.server/;
    proxy_pass $upstream_endpoint;
}

प्रॉक्सी_पास पर डॉक्स समझाता है कि यह चाल क्यों काम करती है:

पैरामीटर मान में चर हो सकते हैं। इस स्थिति में, यदि कोई पता डोमेन नाम के रूप में निर्दिष्ट किया जाता है, तो नाम वर्णित सर्वर समूहों के बीच खोजा जाता है, और यदि नहीं मिला है, तो एक रिज़ॉल्वर का उपयोग करके निर्धारित किया जाता है।

विस्तृत विवरण के लिए कुडोस को "डायनेमिक अपस्ट्रीम के साथ नगनेक्स" (टेनजर.डॉक) , जिसमें फॉरवर्ड यूआरआई के बारे में इस दृष्टिकोण के विवरण पर कुछ प्रासंगिक जानकारी भी है।


1
यह उत्तर सोना है, वास्तव में मेरे साथ क्या हुआ है। अप्स एल्ब और सभी अचानक गेटवे टाइमआउट को इंगित करता है।
नाथन डू

2

एक ही समस्या थी। यह बाहर की तरफ सर्वर पर iptables कनेक्शन ट्रैकिंग के कारण हुआ। --state NEW,ESTABLISHED,RELATEDफ़ायरवॉल स्क्रिप्ट से हटाने और conntrack -Fसमस्या के साथ फ्लशिंग करने के बाद चला गया था।


0

NGINX ही मूल कारण नहीं हो सकता है।

यदि नैट गेटवे पर "वीएम प्रति मिनिमम पोर्ट्स" सेट किया गया है - जो आपके एनजीआईएनएक्स इंस्टेंस और proxy_passगंतव्य के बीच खड़ा है - समवर्ती अनुरोधों की संख्या के लिए बहुत छोटा है, इसे बढ़ाना होगा।

समाधान: NAT गेटवे पर VM प्रति पोर्ट की उपलब्ध संख्या बढ़ाएँ।

प्रसंग मेरे मामले में, Google क्लाउड पर, एक नैट गेटवे के साथ एक रिवर्स प्रॉक्सी NGINX को सबनेट के अंदर रखा गया था। एनजीआईएनएक्स उदाहरण एनएटी गेटवे के माध्यम से हमारे बैकएंड एपीआई (अपस्ट्रीम) से जुड़े एक डोमेन के अनुरोधों को पुनर्निर्देशित कर रहा था।

जीसीपी से यह प्रलेखन आपको यह समझने में मदद करेगा कि एनटी एनजीआईएनएक्स 504 टाइमआउट के लिए कैसे प्रासंगिक है।


-1

मेरे मामले में मैं php को पुनः आरंभ करता हूं और यह ठीक हो जाता है।

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