निगनेक्स प्रॉक्सी अनुरोध विधि द्वारा


17

क्या यह संभव है / मैं अनुरोध विधि (यानी? GET / POST) के आधार पर अलग-अलग बैकेंड को प्रॉक्सी करने के लिए Nginx स्थान ब्लॉक को कैसे कॉन्फ़िगर कर सकता / सकती हूं?

कारण यह है, मैं वर्तमान में 2 तरीकों को 2 अलग-अलग URL (http प्रॉक्सी के माध्यम से और दूसरा fcgi के माध्यम से) संभाल रहा हूं और इसे और अधिक "REST" बनाने की कोशिश कर रहा हूं, इसलिए आदर्श रूप से सूची वापस करने के लिए संसाधन प्राप्त करना पसंद करेंगे , जबकि एक ही संसाधन के लिए पोस्टिंग सूची में जोड़ना चाहिए।

जवाबों:


27

मैं इस कॉन्फ़िगरेशन का उपयोग नहीं करता, लेकिन यहां के उदाहरणों के आधार पर :

location /service  {
  if ($request_method = POST ) {
    fastcgi_pass 127.0.0.1:1234;
  }

  if ($request_method = GET ) {
     alias /path/to/files;
  }
}

यदि आपका अपना आवेदन लिखना है, तो आप उसमें GET / POST की जाँच करने और X-Accel-Redirect headers को भेजने के लिए फ़ाइलों के परिवहन को nginx पर भेजने पर विचार कर सकते हैं ।


GET ब्लॉक मेरे मामले में एक प्रॉक्सी_पास है, लेकिन अन्यथा यह काम करता है। फिलहाल मैं दूसरे का उपयोग नहीं करता है, तो ब्लॉक, nginx प्रकट होता है रोक होने के लिए "संसाधन" जब fastcgi_pass निर्देश तक पहुँच जाता है (यानी। के माध्यम से नहीं गिरने और प्रॉक्सी पास के रूप में अच्छी तरह से चल), क्योंकि मैं वापस लौटने के लिए पोस्ट के अलावा और कुछ चाहते हैं प्रॉक्सी के लिए।
ब्रेंटन एल्कर

2
ध्यान दें कि ifआमतौर पर Nginx प्रलेखन द्वारा हतोत्साहित किया जाता है: nginx.com/resources/wiki/start/topics/depth/ifisevil
vog

1
तो क्या विकल्प है?
WM

1
@WM मेरा जवाब देखें: serverfault.com/a/823053/175421
vog

@vog, दिलचस्प। बहुत स्मार्ट तरीका यह करने के लिए। साझा करने के लिए धन्यवाद।
WM

23

हालाँकि, आप इसे हासिल कर सकते हैं if, यह आमतौर पर Nginx प्रलेखन द्वारा हतोत्साहित किया जाता है , क्योंकि ifअन्य निर्देशों के साथ अच्छा नहीं खेलता है। उदाहरण के लिए, मान लें कि जीईटी सभी के लिए खुला होना चाहिए, जबकि POST केवल HTTP बेसिक ऑथेंटिक का उपयोग करके प्रमाणित उपयोगकर्ताओं के लिए है। यही कारण है कि आवश्यकता होगी ifके साथ जोड़ा जा करने के लिए auth_basicहै, जो ठीक से काम नहीं करता है।

यहां एक विकल्प है जो बिना काम करता है if। चाल "GET" और "POST" को अपस्ट्रीम नामों के हिस्से के रूप में उपयोग करने के लिए है, इसलिए इन्हें परिवर्तनीय विकल्प द्वारा संबोधित किया जा सकता है:

http {
  upstream other_GET {
    server ...;
  }
  upstream other_POST {
    server ...;
  }
  server {
    location /service {
      proxy_pass http://other_$request_method;
    }
  }
}

हर चीज़ के लिए HTTP बेसिक ऑथेंट के साथ इसे मिलाने के लिए, लेकिन एक limit_exceptब्लॉक जोड़ें :

  ...
    location /service {
      proxy_pass http://other_$request_method;
      limit_except GET {
        auth_basic ...;
      }
    }
  ...

इस दृष्टिकोण के साथ समस्या यह है कि अब हम (या जो भी आपके लापता अपस्ट्रीम है) के 502 gateway errorकारण वापस आ जाएंगे no resolver defined to resolve other_HEAD। कुछ लौटाने के लिए यह शब्दार्थ अधिक होगा 405 method not allowed। क्या इसको मदद देने का कोई तरीका है?
जेम्स

1
@ नाम: यह एक नए प्रश्न के रूप में वर्णित किया जा सकता है। मेरे पास इस विवरण के लिए कोई उत्तर नहीं है, लेकिन शायद दूसरों के लिए।
वोग

0

यह वही है जो मैंने मेरे लिए काम करने के लिए किया था

add_header Allow "GET, POST, HEAD" always;
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
    proxy_pass http://back-end;
}

कुदाल कि अनुरोध विधि के आधार पर दो समापन बिंदुओं के बीच स्विच करता है?
बेसिक

0

वोग के उत्तर में थोड़ा बदलाव, अन्य तरीकों जैसे विकल्प, PUT, आदि के लिए एक डिफ़ॉल्ट हैंडलर को शामिल करना।

    upstream webdav_default {
            server example.com;
    }
    upstream webdav_upload {
            server example.com:8081;
    }
    upstream webdav_download {
            server example.com:8082;
    }
    server {
            map upstream_location $request_method {
                    GET     webdav_download;
                    HEAD    webdav_download;
                    PUT     webdav_upload;
                    LOCK    webdav_upload;
                    default webdav_default;
            }
            location / {
                    proxy_pass https://$upstream_location;
            }
    }

0

मुझे काम करने के लिए @timmmmmy से जवाब नहीं मिला, लेकिन इसने मुझे नक्शे के दस्तावेज की ओर इशारा किया और यह मेरे लिए काम कर गया:

map $request_method $upstream_location {
   PUT     example.com:8081;
   POST    example.com:8081;
   PATCH   example.com:8081;
   default example.com:8082;
}
server {
   location / {
      proxy_pass https://$upstream_location;
   }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.