मैं बड़ी संख्या में बैकएंड सर्वरों के साथ, रिवर्स प्रॉक्सी के रूप में नेग्नेक्स सेट करने का प्रयास कर रहा हूं। मैं बैकएंड ऑन-डिमांड (जो पहले अनुरोध पर आता है) शुरू करना चाहता हूं, इसलिए मेरे पास एक नियंत्रण प्रक्रिया (HTTP अनुरोधों द्वारा नियंत्रित) है जो उस अनुरोध के आधार पर बैकएंड को शुरू करता है।
मेरी समस्या इसे करने के लिए nginx को कॉन्फ़िगर कर रही है। यहाँ मेरे पास अभी तक क्या है:
server {
listen 80;
server_name $DOMAINS;
location / {
# redirect to named location
#error_page 418 = @backend;
#return 418; # doesn't work - error_page doesn't work after redirect
try_files /nonexisting-file @backend;
}
location @backend {
proxy_pass http://$BACKEND-IP;
error_page 502 @handle_502; # Backend server down? Try to start it
}
location @handle_502 { # What to do when the backend server is not up
# Ping our control server to start the backend
proxy_pass http://127.0.0.1:82;
# Look at the status codes returned from control server
proxy_intercept_errors on;
# Fallback to error page if control server is down
error_page 502 /fatal_error.html;
# Fallback to error page if control server ran into an error
error_page 503 /fatal_error.html;
# Control server started backend successfully, retry the backend
# Let's use HTTP 451 to communicate a successful backend startup
error_page 451 @backend;
}
location = /fatal_error.html {
# Error page shown when control server is down too
root /home/nginx/www;
internal;
}
}
यह काम नहीं करता है - nginx नियंत्रण सर्वर से लौटे किसी भी स्थिति कोड को अनदेखा करता है। स्थान कार्य error_page
में कोई भी निर्देश नहीं है @handle_502
, और 451 कोड ग्राहक को-के रूप में भेजा जाता है।
मैंने इसके लिए आंतरिक nginx पुनर्निर्देशन का उपयोग करने की कोशिश करना छोड़ दिया, और उसी स्थान पर 307 पुनर्निर्देशित करने के लिए नियंत्रण सर्वर को संशोधित करने का प्रयास किया (ताकि ग्राहक उसी अनुरोध को पुनः प्रयास कर सके, लेकिन अब बैकेंड सर्वर के साथ शुरू हुआ)। हालाँकि, अब nginx स्टेटस कोड को बेवकूफ़ तरीके से ओवरराइट कर रहा है, क्योंकि इसे बैकएंड अनुरोध प्रयास (502) से मिला है, इसके बावजूद कंट्रोल सर्वर "लोकेशन" हेडर भेज रहा है। आखिरकार मैंने error_page लाइन को बदलकर इसे "काम" कर लियाerror_page 502 =307 @handle_502;
, इस प्रकार 307 कोड के साथ ग्राहक को वापस भेजे जाने के लिए सभी नियंत्रण सर्वर उत्तरों को मजबूर करने के लिए। यह बहुत ही घटिया और अवांछनीय है, क्योंकि 1) नियंत्रण सर्वर की प्रतिक्रिया के आधार पर nginx को आगे क्या करना चाहिए, इस पर कोई नियंत्रण नहीं है (आदर्श रूप से हम केवल बैकएंड को फिर से प्राप्त करना चाहते हैं यदि नियंत्रण सर्वर सफलता की रिपोर्ट करता है), और 2) सभी HTTP क्लाइंट HTTP पुनर्निर्देशन का समर्थन करते हैं (उदाहरण के लिए कर्ल उपयोगकर्ता और libcurl का उपयोग करने वाले अनुप्रयोगों को स्पष्ट रूप से पुनर्निर्देशित करने में सक्षम करने की आवश्यकता होती है)।
सर्वर ए, फिर बी, फिर ए (फिर आदर्श रूप में, केवल जब बी एक विशिष्ट स्थिति कोड लौटाता है) को प्रॉक्सी करने की कोशिश करने के लिए nginx प्राप्त करने का उचित तरीका क्या है?
proxy_next_upstream
ट्रिक (अच्छी तरह से मेरा परिदृश्य आपके जैसे जटिल नहीं था), मुझे बस अगले सर्वर की कोशिश करने के लिए nginx चाहिए था यदि कोई त्रुटि हुई, इस प्रकार मुझे जोड़ना थाproxy_next_upstream error timeout invalid_header non_idempotent;
(non_idempotent
क्योंकि, मैं मुख्य रूप सेPOST
अनुरोधों को आगे करना चाहता हूं )।