PHP सेट_टाइम_लिमिट () का उपयोग करके nginx 504 गेटवे टाइमआउट को रोकें


116

मुझे nginx से 504 टाइमआउट संदेश मिल रहे हैं जब मेरी PHP स्क्रिप्ट सामान्य से अधिक समय तक चल रही है। set_time_limit(0)को रोकने के लिए प्रतीत नहीं होता है! नगनेक्स पर php5-fpm चलाने पर क्या यह काम नहीं करता है? यदि हां, तो समय सीमा निर्धारित करने का उचित तरीका क्या है?

त्रुटि:

504 Gateway Time-out
nginx/1.2.7

जवाबों:


193

ऐसे कई तरीके हैं जिनसे आप php-fpm के लिए टाइमआउट सेट कर सकते हैं। में /etc/php5/fpm/pool.d/www.confमैं इस लाइन कहा:

request_terminate_timeout = 180

इसके अलावा, /etc/nginx/sites-available/defaultमैंने प्रश्न में सर्वर के स्थान ब्लॉक में निम्नलिखित पंक्ति जोड़ी:

fastcgi_read_timeout 180;

संपूर्ण स्थान ब्लॉक इस तरह दिखता है:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

अब बस php-fpm और nginx को पुनरारंभ करें और 180 सेकंड से कम समय लेने के अनुरोधों के लिए और अधिक समय समाप्त नहीं होना चाहिए।


2
कोई और सोच रहा है, मेरा (nginx + php5-fpm) के लिए डिफ़ॉल्ट 60 सेकंड था, इसलिए यदि आप एक स्क्रिप्ट @ 60 सेकंड के लिए "गेटवे टाइमआउट" देखते हैं, तो "fastcgi_read_timeout" सेटिंग को जोड़ा जाना चाहिए
माइकल गुयेन

1
मैं दिनों के लिए यह पता लगाने की कोशिश कर रहा हूं, और @ pymkin का जवाब है कि मेरे लिए क्या काम किया है। अपने जैसे अन्य शौकीनों के लिए, जो सोच रहे हैं कि nginx और php5-fpm को कैसे पुनः आरंभ करें, निम्नलिखित दो कमांड चलाएं: sudo service nginx पुनरारंभ और sudo service php5-fpm पुनरारंभ केवल एक चीज जो मैंने अलग तरीके से की है, वह यह है कि मैंने इन सेटिंग्स को केवल एक में ही लागू किया है मेरे सर्वर पर सभी वेबसाइटों के लिए कॉन्फ़िगरेशन के बजाय मेरी वेबसाइट।
पामेला

4
अफसोस की बात है, कोई फर्क नहीं पड़ता कि मैं क्या सेट करता हूं fastcgi_read_timeout उस locationब्लॉक में , यह 60 सेकंड के बाद भी बाहर है।
स्पेंसर विलियम्स

यह स्वीकृत उत्तर होना चाहिए। इतने सारे समाधानों की कोशिश की लेकिन केवल यह काम करता है। मैं लार्वा होमस्टेड का उपयोग कर रहा था और इसमें 504 गेटवे टाइमआउट त्रुटि थी और इसने इसे ठीक किया।
अंबु ३६

यदि लारवेल का उपयोग कर रहे हैं, तो आपको इसे locationब्लॉक में सेट करना होगा जो कि डॉक्रो के बजाय php स्क्रिप्ट को संभालता है।
रयान ड्यूवल

50

इस लिंक को आज़माएं , इसका बेहतर समाधान है कि इसे कैसे ठीक किया जाए। तो कदम हैं:

  1. निर्देशिका nginx.confमें स्थित अपनी फ़ाइल खोलें /etc/nginx
  2. इसे नीचे दिए गए कोड ऑफ http {सेक्शन में जोड़ें:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    नोट: यदि इसका पहले से मौजूद है, तो मानों को बदल दें।

  3. रिलोड नग्नेक्स और php5-fpm।

    $ service nginx reload
    $ service php5-fpm reload

    यदि त्रुटि बनी रहती है, तो मानों को बढ़ाने पर विचार करें।


1
यह कारण नहीं खोजता है, यह केवल त्रुटि तक बढ़ जाता है। लेकिन बेहतर यह होगा कि इसका समाधान ढूंढा जाए कि यह इतना लंबा क्यों है। जब लोकलहोस्ट पर मैं एकमात्र ग्राहक हूं और यह इतना लंबा लोड करता है, कि विकास करते समय इंतजार करना बिल्कुल भी अच्छा नहीं है।
डेरियस .V

16
सवाल धीमी स्क्रिप्ट के कारण के लिए नहीं पूछ रहा है, यह सर्वर को लंबे समय तक इंतजार करने का एक तरीका पूछ रहा है। कभी-कभी आपको विशेष स्क्रिप्ट चलाने की ज़रूरत होती है जो ऐसे कार्य करते हैं जो बहुत लंबे समय तक करते हैं, और यह एक बुरी बात नहीं है।
orrd

अपडेटेड (ऊपर) लिंक: codetweet.com/nginx/…
nadavkav

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

ध्यान रखें कि इन वैश्विक सेटिंग्स को प्रति साइट सेटिंग्स द्वारा ओवरराइड किया जाएगा /etc/nginx/sites-available/mysite.com
मैक

11

आप nginx द्वारा जारी टाइमआउट को रोकने के लिए PHP का उपयोग नहीं कर सकते।

अधिक समय देखने के लिए proxy_read_timeoutनिर्देश देखने के लिए nginx को कॉन्फ़िगर करना ।


इससे मुझे जो समस्या हो रही थी, उसे हल किया जहां 504 मेरे योनि बॉक्स (वैप्रोबैश का उपयोग करके) को दिखाना शुरू करेंगे।
एंडी फ्लेमिंग

2
मेरा मानना ​​है कि यह उत्तर केवल तभी लागू होता है, जब आप सिर्फ Nginx को प्रॉक्सी सर्वर के रूप में उपयोग कर रहे हों। यदि आप अपने प्राथमिक वेब सर्वर (PHP-FPM के साथ) के रूप में Nginx का उपयोग कर रहे हैं तो यह काम नहीं करेगा।
21

10

सही उत्तर आपके Nginx कॉन्फ़िगरेशन में fastcgi_read_timeout बढ़ा रहा है।
इतना ही आसान!


7
 sudo nano /etc/nginx/nginx.conf

इन चरों को nginx.conf फ़ाइल में जोड़ें:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

और फिर पुनरारंभ करें:

service nginx reload

4

तीन प्रकार के टाइमआउट हैं जो इस तरह के मामले में हो सकते हैं। यह देखा जा सकता है कि प्रत्येक उत्तर इन संभावनाओं के केवल एक पहलू पर केंद्रित है। इसलिए, मैंने इसे लिखने के लिए सोचा, ताकि भविष्य में यहां आने वाले किसी व्यक्ति को बेतरतीब ढंग से प्रत्येक उत्तर की जांच करने की जरूरत न पड़े और बिना काम किए सफलता मिल सके।

  1. अनुरोधकर्ता से टाइमआउट अनुरोध - टाइमआउट हेडर सेट करने की आवश्यकता है (लाइब्रेरी के अनुरोध में हेडर कॉन्फ़िगरेशन देखें)
  2. अनुरोध करते समय नेग्नेक्स से टाइमआउट (अनुमानित सर्वर पर अग्रेषित करने से पहले) जैसे: विशाल फ़ाइल अपलोड की जा रही है
  3. अनुमानित सर्वर पर अग्रेषित करने के बाद का समय , सर्वर समय में वापस nginx का जवाब नहीं देता है। उदाहरण: समय लेने वाली स्क्रिप्ट सर्वर पर चल रही है

इसलिए प्रत्येक समस्या के लिए समाधान निम्नानुसार हैं।

  1. टाइमआउट हैडर सेट करें जैसे: अजाक्स में

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx क्लाइंट टाइमआउट

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. नगीनेक्स प्रॉक्साइड सर्वर टाइमआउट

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

इसलिए जिस चीज की आपको जरूरत है, उसका इस्तेमाल करें। शायद कुछ मामलों में, आपको इन सभी कॉन्फ़िगरेशन की आवश्यकता है। मुझे चाहिए था।


1

आपको अतिरिक्त nginx निर्देश ( जैसे ngx_http_proxy_module) को nginx.conf, जैसे:

proxy_read_timeout 300;

मूल रूप से nginx proxy_read_timeoutनिर्देश प्रॉक्सी टाइमआउट को बदलता FcgidIOTimeoutहै, स्क्रिप्ट के लिए है जो बहुत लंबे समय तक शांत है, औरFcgidBusyTimeout स्क्रिप्ट के लिए है जिसे निष्पादित करने में बहुत लंबा समय लगता है।

यदि आप FastCGI एप्लिकेशन का उपयोग कर रहे हैं, तो भी इन विकल्पों को बढ़ाएँ:

FcgidBusyTimeout 300
FcgidIOTimeout 250

फिर nginx और PHP5-FPM को पुनः लोड करें।

Plesk

Plesk में, आप इसे अतिरिक्त nginx निर्देशों के तहत वेब सर्वर सेटिंग्स में जोड़ सकते हैं

FastCGI के लिए HTTP के लिए अतिरिक्त निर्देशों के तहत वेब सर्वर सेटिंग्स में जाँच करें ।

देखें: Plesk में FastCGI टाइमआउट मुद्दों को कैसे ठीक करें?


क्या FcgidBusyTimeoutकेवल Apache के लिए वैरिएबल मौजूद नहीं है?
स्लाविक

0

चूंकि आप php-fpm का उपयोग कर रहे हैं, इसलिए आपको अपने अनुरोधों को जानने के लिए fastcgi_finish_request () का लाभ लेना चाहिए जो आपको अधिक समय लग सकता है।


-1

set_time_limit(0)Php-fpm या समान प्रक्रिया प्रबंधक का उपयोग करते समय उपयोग करना बेकार है।

बॉटमलाइन का उपयोग करते set_time_limitसमय उपयोग नहीं करना है php-fpm, अपने निष्पादन के समय को बढ़ाने के लिए, इस ट्यूटोरियल की जांच करें ।


8
यदि उत्तर की समय सीमा समाप्त हो जाती है, तो उत्तर के साथ ही कुछ उत्तर भी दिए जा सकते हैं।
लक्ष्मी

-7

मैं कॉन्फ़िगर APACHE के साथ इस समस्या को हल करता हूं! सभी विधियाँ (इस विषय में) मेरे लिए गलत हैं ... फिर मैं चंचल अपाचे विन्यास की कोशिश करता हूँ:

Timeout 3600

फिर मेरी स्क्रिप्ट पर काम हुआ!


5
प्रश्न में कहा गया है कि यदि आप अपाचे से परेशान हैं, तो आपको उसके लिए खोज करनी चाहिए।
होगन

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