अपाचे 2 प्रॉक्सी टाइमआउट


23

मेरे पास Apache2 है जिसके साथ PHP + PHP-FPM कॉन्फ़िगर किया गया है:

http://wiki.apache.org/httpd/PHP-FPM

मैं एक स्क्रिप्ट लिख रहा हूं, जो एक आंतरिक Vhost पर निष्पादित करने में एक लंबा समय लेगा, लेकिन समय समाप्त हो रहा है, अगर स्क्रिप्ट 30 सेकंड से कम में निष्पादित होती है, तो सब कुछ त्रुटिपूर्ण रूप से चलता है।

मेरी अपाचे लॉग मुझे बताता है:

[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:

जब स्क्रिप्ट चलाने की कोशिश की जाती है, तो मुझे 503 Service Unavailableनिष्पादन के 30 सेकंड के समय के बाद दिया जाता है । तार्किक रूप से इसका मतलब होगा कि मेरे पास 30 सेकंड के लिए एक टाइमआउट निर्देश या सेटिंग है, लेकिन मेरे पास मेरे Vhost के कॉन्फिगर में ये हैं:

Timeout 600
<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
    ProxyTimeout 600
</IfModule>

(php-fpm मेरे लिए पोर्ट 9001 पर चल रहा है)

मैं भी रखने की कोशिश की है Timeoutऔर ProxyTimeoutमें httpd.confकोई अंतर नहीं है।

ऐसा लगता है कि एक और टाइमआउट सेटिंग है जो कहीं विशिष्ट है mod_proxy_fcgi, लेकिन मुझे यह नहीं मिल रहा है। मैंने आधिकारिक टारबॉल से Apache2 httpd स्थापित किया, कोई भी मॉड किसी भी विन्यास फाइल के साथ नहीं आया है।

अगर कोई मुझे सही दिशा में इंगित कर सकता है तो इसकी बहुत प्रशंसा होगी।

जवाबों:


32

अंत में मैंने कई कॉन्फ़िगरेशन मापदंडों का परीक्षण करने के बाद इस समस्या को ठीक किया। मैंने पिछले सभी परिवर्तनों को हटाते हुए समाधान का दो बार परीक्षण किया। इसे ठीक करने के लिए केवल एक पैरामीटर की आवश्यकता थी।

Httpd और mod_proxy_fcgi के नवीनतम संस्करणों के लिए आप बस पंक्ति timeout=के अंत में जोड़ सकते हैं ProxyPassMatch, जैसे:

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

पुराने संस्करणों के लिए यह थोड़ा अधिक जटिल था, उदाहरण के लिए:

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

टाइमआउट को 30 मिनट तक सेट करने के लिए मुझे प्रॉक्सी निर्देश को जोड़ने की आवश्यकता थी। कुछ अनुप्रयोगों में, आमतौर पर जब ऑपरेटिंग डेटाबेस, ऐसे रूटीन होते हैं जिन्हें निष्पादित करने में 10 मिनट से अधिक समय लग सकता है। मैंने अस्थायी रूप से तय किया कि वे सुनिश्चित करने के लिए 30 मिनट का समय दें। इंस्टॉलेशन विज़ार्ड का उपयोग करते समय विशेष रूप से उपयोगी है, जो बहुत अधिक समय लेता है (मेरी विनम्र राय में)।

जिस तरह से इस मुद्दे को हल करने में मदद करने वाले इंटिअल इनपुट ने मुझे निम्न URL पते में पाया था ।


1
ऐसा लगता है कि यह अपाचे, AH00526: ProxyPass / <Proxy> और ProxyPassMatch / <ProxyMatch> के हाल के संस्करणों के तहत टूट गया, पूरी तरह से एक ही कार्यकर्ता के नाम के साथ उपयोग नहीं किया जा सकता है
स्टीवर्ट एडम

4
मैंने ProxyPassMatch लाइन के अंत में एक पैरामीटर 'टाइमआउट = 120' जोड़कर ऊपर हल किया है।
स्टीवर्ट एडम


दो और चीज़ें जो मुझे चाहिए थीं: पहली, आप -must- सेट "टाइमआउट" और "ProxyTimeout" आपकी वैश्विक Apache config फाइल में अन्य FPM टाइमआउट की तुलना में अधिक समय तक होना चाहिए। दूसरा, मेरा FPM पूल एक यूनिक्स सॉकेट पर सुन रहा था और मैं सेटहैंडलर का उपयोग करता हूं जैसे: [सेटहैंडलर "प्रॉक्सी: यूनिक्स: /var/run/php/example.com-php7.0-fpm.sock। fcgi: // localhost | 8000 "] है। लेकिन <प्रॉक्सी> fcgi पर मेल खाता है: // सेटहैंडलर लाइन का स्थानीय हिस्‍सा (एएफटीईआर के भाग। ... जो वास्तव में उपयोग भी नहीं किया जाता है!) और यूनिक्स नहीं: / var / run / part। उपर्युक्त उपयोग के लिए समय-समय पर कॉन्फ़िगर करने के लिए: <प्रॉक्सी fcgi: // localhost: 8000> और नहीं <प्रॉक्सी यूनिक्स: / var / run / ...
प्रोफेसर फॉकन

9

मैं यह बताना चाहता था कि यद्यपि यह उत्तर पुराने संस्करणों के लिए बहुत अच्छा काम करता है, लेकिन यह अपाचे 2.4 के हाल के संस्करणों में त्रुटि कोड AH00526 के साथ टूट जाता है। ProxyPassऔर ProxyPassMatchया <Proxy>और <ProxyMatch>एक ही कार्यकर्ता नाम के भीतर एक साथ नहीं किया जा सकता। यह ठीक काम करता था, इसलिए यह नहीं जानते कि यह डिज़ाइन द्वारा बदला गया था या यदि यह बग है।

किसी भी तरह से, आप केवल पैरामीटर 'टाइमआउट = 120' (या जो भी आपका वांछित मूल्य है) के साथ एक प्रॉक्सीपेसमैच का उपयोग करके इसे ठीक कर सकते हैं, जैसे:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

6

मेरे पास Apache 2.4.6 है, लेकिन इसे ठीक करने के लिए पैच Apache> = 2.4.8 में दिया गया है। यहां कुंजी तुरंत अपना आउटपुट शुरू करने के लिए है ताकि अपाचे (mod_proxy_fcgi) को लगता है कि कनेक्शन सक्रिय है।

उदाहरण के लिए, मैं अपने AJAX कॉल में 30 सेकंड के लिए PHP और DB क्वेरी का उपयोग कर रहा हूं। क्योंकि मुझे पता है कि समग्र प्रतिक्रिया "सामग्री-प्रकार: आवेदन / json" होगी, मैं तुरंत उस हेडर को भेजता हूं।

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

2

ऐसा नहीं होना चाहिए:

<IfModule mod_proxy.c>

सुनिश्चित करें कि php.ini सेटिंग max_execution_time 600 पर भी सेट है। (चेक phpinfo () लाइव पेज पर सुनिश्चित करें कि आप उपयोग किए गए वास्तविक मूल्य देख रहे हैं)

जेनी ने कहा, php-fpm सेटिंग सेट करें

request_terminate_timeout 610s

(नोट को अंत में ध्यान दें)

स्वयं mod_proxy_fcgi से कॉन्फ़िगर करने के लिए बहुत कुछ नहीं है, जैसा कि आप अपाचे पृष्ठ पर देख सकते हैं। http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

Php-fpm डिबग लॉगिंग को भी चालू करें ताकि आप यह देख सकें कि यह कहाँ है। http://php-fpm.org/wiki/Configuration_File (भी catch_workers_output पर बारी)

और mod_proxy और mod_proxy_fcgi मॉड्यूल के लिए डिबग स्तर लॉगिंग चालू करें क्योंकि आप अपाचे 2.4 का उपयोग कर रहे हैं। बहुत अच्छी सुविधा, बस उन मॉड्यूलों को चालू करें जिनकी आपको आवश्यकता है: http://httpd.apache.org/docs/current/mod/core.html#loglevel

यदि वे मदद नहीं करते हैं, तो अपने php-fpm config फाइल को पोस्ट करें।

अंतिम उपाय के रूप में, शायद कुछ डेमन लंबे समय से चल रही प्रक्रिया को मार रहे हैं?


2

मैंने नोट किया कि आप PHP-FPM का उपयोग कर रहे हैं। मैं भी इसका इस्तेमाल करता हूं, लेकिन Apache 2.4.6 के साथ।

यह मानते हुए कि इस मुद्दे को कुछ समय के लिए ही अस्तित्व में है, यह है कि के लिए टाइमआउट मान लगता mod_proxy_fcgiहै कठिन कोडित । मैंने यहां जो कुछ भी लिखा है, उसे लिखा


1

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

Ih php-pfm के लिए कॉन्फिग फाइल, देखें

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

इसे अपाचे में टाइमआउट सेटिंग के समान या थोड़ा नीचे सेट किया जाना चाहिए।


1
मैंने request_terminate_timeout400 में सेट किया है, फिर भी कोई बदलाव नहीं हुआ है :( मुझे महसूस हुआ है कि ऐसी कोई चीज़ है जिसे मुझे सेट करने की आवश्यकता है mod_proxy_fcgi, लेकिन यह किसी भी कॉन्फ़िगरेशन फ़ाइल के साथ नहीं आती है।
wyqydsyq

0

टाइमआउट के अलावा, enablereuse = बंद सेट करें। मैंने पाया कि जब यह लंबे समय तक चलने वाली स्क्रिप्ट के कुछ अनुरोधों पर था, तो यह सही ढंग से काम करेगा और दूसरों को जल्दी मार दिया जाएगा।


0

इस पोस्ट ने मेरे लिए पूरी डील बदल दी।

ऐसा लगता है कि Apache का mod_reqtimeout डिफ़ॉल्ट मान का उपयोग नहीं करेगा।

निम्नलिखित पंक्तियों को अपनी httpd.conf फ़ाइल में जोड़ें:

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.