NGINX: अपस्ट्रीम से प्रतिक्रिया हेडर पढ़ते हुए अपस्ट्रीम टाइम आउट (110: कनेक्शन टाइम आउट)


130

मेरे पास प्यूमा अपस्ट्रीम ऐप सर्वर और रिआक के रूप में मेरी पृष्ठभूमि डीबी क्लस्टर के रूप में चल रहा है। जब मैं एक अनुरोध भेजता हूं कि मानचित्र लगभग 25K उपयोगकर्ताओं के लिए डेटा का एक हिस्सा कम कर देता है और इसे Riak से ऐप में वापस कर देता है, तो मुझे Nginx लॉग में एक त्रुटि मिलती है:

अपस्ट्रीम से प्रतिक्रिया हेडर पढ़ते हुए अपस्ट्रीम टाइम आउट (110: कनेक्शन टाइम आउट)

यदि मैं अपने अपस्ट्रीम को सीधे nginx प्रॉक्सी के बिना क्वेरी करता हूं, तो उसी अनुरोध के साथ, मुझे आवश्यक डेटा मिलता है।

प्रॉक्सी में डालने के बाद Nginx टाइमआउट होता है।

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx में टाइमआउट निर्देशों का एक समूह है। मुझे नहीं पता कि मैं कुछ महत्वपूर्ण याद कर रहा हूँ। किसी भी मदद को बहुत सराहा जाएगा....


600s के बाद ही इसे टाइमआउट करना चाहिए? आप इसे 127.0.0.1:3000 पर एक tcp सर्वर सेट करके समय-समय पर नकली कर सकते हैं, जो केवल कनेक्शन स्वीकार करता है और उनके साथ कुछ भी नहीं करता है, यह देखने के लिए कि कितना समय लगता है। यह 600s होना चाहिए ...
rogerdpack

जवाबों:


47

ऐसा इसलिए होता है क्योंकि आपके अपस्ट्रीम को रिक्वेस्ट का जवाब देने में बहुत ज्यादा समय लगता है और NGINX को लगता है कि अपस्ट्रीम रिक्वेस्ट को प्रोसेस करने में पहले से ही फेल है, इसलिए यह एक एरर के साथ प्रतिक्रिया करता है। बस को शामिल करें और config_read_timeout को locationकॉन्फ़िगर ब्लॉक में बढ़ाएं । मेरे साथ एक ही बात हुई और मैंने काम के दौरान एक आंतरिक ऐप के लिए 1 घंटे का टाइमआउट किया:

proxy_read_timeout 3600;

इसके साथ, एनजीआईएनएक्स कुछ वापसी करने के लिए अपने अपस्ट्रीम के लिए एक घंटे (3600 के दशक) का इंतजार करेगा।


6
ध्यान दें कि http अनुभाग proxy_read_timeoutमें होने से मदद नहीं मिल सकती है। मेरे पास स्थान अनुभाग में निर्देश है और केवल वहां की सेटिंग से फर्क पड़ा है। (नग्नेक्स 1.16.0)proxy_passproxy_read_timeout
जॉनीजेड

मेरे लिए http / सर्वर / लोकेशन में काम करने लगता है ... शायद चीजें बदल गई हैं :)
rogerdpack

39

आपको हमेशा टाइमआउट बढ़ाने से बचना चाहिए, मुझे संदेह है कि आपके बैकएंड सर्वर की प्रतिक्रिया समय किसी भी मामले में यहां मुद्दा है।

मैं इस मुद्दे के इर्दगिर्द इस संबंध को बनाए रखने के झंडे को साफ़ कर रहा हूं और जवाब के अनुसार http संस्करण निर्दिष्ट कर रहा हूं: https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

दुर्भाग्यवश मैं यह नहीं समझा सकता कि यह क्यों काम करता है और इसका जवाब देने के लिए दिए गए उत्तर में बताए गए दस्तावेज़ों से इसे समझने का प्रबंधन नहीं किया है, अगर किसी के पास कोई स्पष्टीकरण है तो मैं इसे सुनने के लिए बहुत इच्छुक हूं।


1
proxy_read_timeoutयदि आप जानते हैं कि प्रॉक्सी (यदि किसी विशिष्ट URL के लिए भी) को अधिक प्रसंस्करण समय की आवश्यकता है , तो आप इसे समायोजित क्यों नहीं करेंगे ?
जोश एम।

नमस्ते! मुझे सटीक मुद्दा किसी भी अधिक याद नहीं है, लेकिन मुझे लगता है कि यह यूआरएल के लिए वास्तविक समय से संबंधित नहीं था, बल्कि यह है कि इन सेटिंग्स के बिना टाइमआउट को सही तरीके से संसाधित नहीं किया जा रहा था।
7

@magicbacon यह साल पहले था इसलिए मैं मुश्किल से किसी भी मामले को याद करता हूं लेकिन, आपने $http_hostसही बदला ? मैं अनुमान लगा रहा हूं कि https के लिए उड़ान नहीं भरेगी। हो सकता है कि अतिरिक्त सेटिंग्स भी https अनुरोधों के लिए आवश्यक हों।
1

+1 ... यह एक अजीब हैक की तरह दिखता है, लेकिन वास्तव में यह आधिकारिक डॉक्स से है :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive मुझे प्रतिक्रिया पढ़ते समय थोड़ी सी समस्या "अपस्ट्रीम समय से पहले बंद कनेक्शन है" हेडर अपस्ट्रीम से "जब मैं अपस्ट्रीम डायरेक्टिव का उपयोग रखने के साथ करता हूं और इन दो लाइनों का उपयोग करके इसे ठीक करने लगता है।
करुसेल

1
@TimDavis मैं देख रहा हूँ, शायद यह बेहतर है। मुझे लगता है कि यह ट्रैफ़िक पर निर्भर हो सकता है, जैसे कि इस पोस्ट में यह कहा जा रहा है कि यह WebSockets के लिए आवश्यक है: serverlab.ca/tutorials/linux/web-servers-linux/…
Almund

26

पहला आंकड़ा जो अपस्ट्रीम nginx त्रुटि लॉग फ़ाइल से परामर्श करके धीमा कर रहा है और मेरे मामले के अनुसार पढ़ने के समय को समायोजित करता है, यह fastgGI था

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

इसलिए मुझे अपने सर्वर कॉन्फ़िगरेशन में fastcgi_read_timeout को समायोजित करना होगा

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

देखें: मूल पोस्ट


टाइमिंग जानकारी जोड़ने में विफलता का एक तरीका यह है कि इसे बढ़ाने के लिए आपको "ज़रूरत" कितनी है: stackoverflow.com/questions/18627469/… FWIW
rogerdpack

10

आपके मामले में यह प्रॉक्सी में थोड़ा अनुकूलन करने में मदद करता है, या आप "# टाइम आउट सेटिंग्स" का उपयोग कर सकते हैं

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

मेरे लिए यह स्थान अनुभाग में इन सेटिंग्स होने से फर्क पड़ता है । उन में होने http अनुभाग नहीं मदद (pssibly क्योंकि मैं भी था proxy_passमें स्थान अनुभाग।
JonnyJD

आप वास्तव में इन घोषणाओं के साथ क्या कर रहे हैं?
Vlad

9

मुझे लगता है कि यह त्रुटि विभिन्न कारणों से हो सकती है, लेकिन यह आपके द्वारा उपयोग किए जा रहे मॉड्यूल के लिए विशिष्ट हो सकती है। उदाहरण के लिए मैंने इसे uwsgi मॉड्यूल का उपयोग करते हुए देखा, इसलिए "uwsgi_read_timeout" सेट करना पड़ा।


2
मुझे लगता है कि uwsgi_read_timeout 3600; xy_send_timeout 3600; xy_read_timeout 3600; मेरे लिये कार्य करता है।
त्नन

9

मैं error_logsविशेष रूप से अपस्ट्रीम भाग पर देखने की सलाह दूंगा जहां यह विशिष्ट अपस्ट्रीम दिखाता है जो टाइमिंग आउट है।

फिर उसके आधार पर आप समायोजित कर सकते हैं proxy_read_timeout, fastcgi_read_timeoutया uwsgi_read_timeout

यह भी सुनिश्चित करें कि आपका कॉन्फ़िगरेशन लोड है।

यहाँ अधिक जानकारी Nginx अपस्ट्रीम समय से बाहर (क्यों और कैसे ठीक करने के लिए)


4

जैसा कि कई अन्य लोगों ने यहां बताया है, एनजीआईएनएक्स के लिए टाइमआउट सेटिंग्स बढ़ाने से आपकी समस्या हल हो सकती है।

हालाँकि, आपकी टाइमआउट सेटिंग को बढ़ाना उतना सरल नहीं हो सकता है, जितना कि इनमें से कई उत्तर सुझाते हैं। मैंने खुद इस समस्या का सामना किया और /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;

1

मेरे पास एक ही समस्या थी और इसके परिणामस्वरूप रेल नियंत्रक में "हर दिन" त्रुटि थी। मुझे पता नहीं क्यों, लेकिन उत्पादन पर, प्यूमा ने त्रुटि को फिर से चलाया और संदेश का कारण बना:

अपस्ट्रीम से प्रतिक्रिया हेडर पढ़ते हुए अपस्ट्रीम टाइम आउट (110: कनेक्शन टाइम आउट)

शायद इसलिए कि नग्नेक्स बार-बार प्यूमा से डेटा प्राप्त करने की कोशिश करता है। मजेदार बात यह है कि त्रुटि टाइमआउट संदेश का कारण बनती है, भले ही मैं नियंत्रक में एक अलग कार्रवाई कह रहा हूं, इसलिए, एक एकल टाइपो सभी ऐप को ब्लॉक करता है।

यह देखने के लिए कि क्या स्थिति है, अपने लॉग / puma.stderr.log फ़ाइल की जाँच करें।


0

हमारी तरफ से यह प्रॉक्सी कैश के साथ स्पडी का उपयोग कर रहा था। जब कैश समाप्त हो जाता है तो हमें यह त्रुटि तब तक मिलती है जब तक कि कैश अपडेट नहीं हो जाता।


0

उम्मीद है कि यह किसी की मदद करता है: मैं इस त्रुटि में भाग गया और इसका कारण phpfpm के लिए लॉग फ़ोल्डर पर गलत अनुमति थी, इसे बदलने के बाद phpfpm इसे लिख सकता था, सब कुछ ठीक था।


0

के लिए proxy_upstreamसमय समाप्त, मैं ऊपर सेटिंग की कोशिश की लेकिन इन काम नहीं किया।

सेटिंग resolver_timeoutने मेरे लिए काम किया, यह जानते हुए कि अपस्ट्रीम टाइमआउट संदेश का उत्पादन करने में 30 का समय लग रहा था। जैसे me.atwibble.com को हल नहीं किया जा सका (110: ऑपरेशन समय समाप्त)

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

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