2016-04-12 9 views
13

nginx 1.9 चल रहा है */पीएचपी 7.0 * (लेकिन ठीक उसी व्यवहार 5.6 में * भी।)Nginx/पीएचपी एफ पी एम सुंदर स्टॉप (SIGQUIT): इतना सुंदर नहीं

शान से एक PHP-एफ पी एम को रोकने के लिए प्रयास कर रहा है /।। रखरखाव के दौरान नोड शटडाउन के लिए nginx कॉम्बो। ऐसा करने के लिए, मैं SIGQUIT को php-fpm पर भेज रहा हूं, जो एक शानदार शटडाउन प्रदान करना चाहिए।

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 12 Apr 2016 04:48:00 GMT 
Content-Type: text/html; charset=UTF-8 
Connection: close 

वांछित:

इस परीक्षण के लिए, मैं एक गूंगा स्क्रिप्ट

<?php sleep(5); echo 'done'; 

निम्नलिखित कर्ल

curl -I x.x.x.x:8080 

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

दुर्भाग्य से, जब मैं इस व्यवहार पीएचपी-एफ पी एम मास्टर की प्रक्रिया के लिए एक SIGQUIT (http://manpages.ubuntu.com/manpages/precise/man8/php5-fpm.8.html) भेज कर, को गति प्रदान करने का प्रयास करें: एक ngnix में जिसके परिणामस्वरूप,

kill -s SIGQUIT $FPMPID 

कनेक्शन तुरंत बूँदें 502

HTTP/1.1 502 Bad Gateway 
Server: nginx 
Date: Tue, 12 Apr 2016 04:48:07 GMT 
Content-Type: text/html 
Content-Length: 166 
Connection: close 

कोई सलाह? मैं सिस्टम के इस टुकड़े को जितना संभव हो सके निर्बाध बनाना पसंद करूंगा। धन्यवाद!

+0

संलग्न लिंक काफी मृत (503) है, प्रक्रिया संकेतों का सारांश यहां दिया गया है: https://forum.nginx.org/read.php?3,3485,template=head%3F%3F। –

+3

हां। https://bugs.php.net/bug.php?id=41593 और, मेरे लिए भी महत्वपूर्ण-एर, ** https: //bugs.php.net/bug.php? id = 60961 **। मुझे नहीं पता कि वास्तव में (और यदि) वे कैसे संबंधित हैं, लेकिन दुर्भाग्यवश PHP-FPM में इसकी छोटी परेशानी है। – Smuuf

+0

मैं आपको थोड़ा सा कामकाज सुझा सकता हूं। यह php-fpm को ठीक नहीं करता है, लेकिन 200 का उत्तर देने में मदद करता है :) आपको केवल 2 बैकएंड के साथ nginx कॉन्फ़िगरेशन में 'अपस्ट्रीम' सेट अप करना है (यह कुछ ही php-fpm पूल हो सकता है)। इसलिए, यदि अनुरोधों में से कोई एक विफल रहता है, तो nginx फिर से बैकएंड का अनुरोध करने का प्रयास करेगा। –

उत्तर

1

थोड़ी देर के लिए इसी स्थिति के साथ संघर्ष करने के बाद, मेरा मानना ​​है कि मुझे मरने से पहले बाल प्रक्रियाओं को संभालने के लिए जादुई कॉन्फ़िगरेशन सेटिंग मिली है।

http://php.net/manual/en/install.fpm.configuration.php#process-control-timeout

process_control_timeout

समय सीमा बच्चे प्रक्रियाओं गुरु से मिलने वाले संकेतों पर प्रतिक्रिया के लिए प्रतीक्षा करने के लिए

असल में, 10s की तरह कुछ करने के लिए इस की स्थापना करके, बच्चे छोड़ने से पहले मौजूदा अनुरोधों को संभालने के दौरान, प्रक्रिया लंबे समय तक प्रतीक्षा करेगी।

दुर्भाग्य से, ऐसा लगता है कि php-fpm मास्टर प्रक्रिया तुरंत बाहर निकल जाता है, इसलिए, कोड here से प्रेरित है, मैं एक आवरण पटकथा लिखी:

#!/bin/bash 

PHP_FPM_PID='/php-fpm.pid' 

wait_for_pid() { 
    try=0 

    while test $try -lt 35 ; do 
     if [ ! -f "$1" ] ; then 
      try='' 
      break 
     fi 

     echo -n . 
     try=`expr $try + 1` 
     sleep 1 
    done 
} 

function clean_up { 

    echo "Killing $(cat $PHP_FPM_PID)" 

    kill -QUIT `cat $PHP_FPM_PID` 
    wait_for_pid $PHP_FPM_PID 

    echo "Done!" 

    exit 0 
} 

trap clean_up EXIT 

nohup php-fpm --daemonize --pid $PHP_FPM_PID 2>&1 & 

while true; do sleep 1; done 
#^do nothing forever 

जो 35 सेकंड इंतजार कर रहा है या जब तक कि पीआईडी ​​फ़ाइल हटा दिया गया है (संभवतः बाल प्रक्रियाओं में से एक द्वारा? मैं अभी भी पर अस्पष्ट हूं कि इसे हटा दिया गया है)।

भले ही, यह रैपर स्क्रिप्ट हमारे php-fpm डॉकर कंटेनर के लिए CMD के रूप में अच्छी तरह से काम करती है जिसे हम कुबेरनेट के साथ चल रहे हैं।

+1

एक उपयोगी सेटिंग की तरह लगता है, लेकिन इसका मतलब यह है कि यह हमेशा * प्रतिक्रिया देने से पहले एक्स सेकंड इंतजार करता है? मैंने अपने डॉकर कंटेनर (https://github.com/bryanlatten/docker-php) के लिए इस प्रक्रिया को उलट दिया है, जहां तुरंत चुपचाप बंद करने के लिए एफपीएम को सिग्नल करने की बजाय, मैंने अपनी अगली nginx प्रॉक्सी को चुपचाप बंद कर दिया - जो करेगा सुंदर रहें और कनेक्शन पूरा होने की प्रतीक्षा करें। सिद्धांत रूप में, कोई कनेक्शन आने के साथ, और आउटगोइंग कनेक्शन बंद होने की प्रतीक्षा कर रहे हैं, तो PHP एक हाथी की तरह समाप्त हो सकता है और उड़ान में कुछ भी प्रभावित नहीं होना चाहिए। इसका कोई मतलब भी है क्या? –

+0

बिल्कुल, मुझे लगता है कि यहां एक सुंदर-शट डाउन-प्रॉक्सी के रूप में nginx का उपयोग करना सही समाधान है। यह दुर्भाग्यवश हमारे लिए काम नहीं करेगा, लेकिन मुझे लगता है कि भविष्य में जाने का यही तरीका है। –