मैं एक एप्लिकेशन बना रहा हूं जहां मुझे एपीआई-डेटा संयोजन उपयोग पर कुछ विश्लेषण करने की ज़रूरत है। नीचे मेरा nginx विन्यास है -

location /r/ {
    rewrite /r/(.*)$ http://localhost:3000/sample/route1/$1 redirect;
    post_action /aftersampleroute1/$1;
}
location /aftersampleroute1/ {
    rewrite /aftersampleroute1/(.*) /stats/$1;
    proxy_pass http://127.0.0.1:3000;
}

स्थान /r/ का उपयोग ब्राउज़र अनुरोध http://localhost:80/r/quwjDP4us को एपीआई /sample/route1/quwjDP4us पर रीडायरेक्ट करने के लिए किया जाता है जो कुछ करने के लिए आईडी quwjDP4us का उपयोग करता है। अब पृष्ठभूमि में मैं आईडी quwjDP4us को एक आंकड़े एपीआई /stats/quwjDP4us में पास करना चाहता हूं जो उस आईडी के लिए डीबी रिकॉर्ड अपडेट करता है।

जब मैं nginx शुरू करता हूं और अनुरोध करता हूं http://localhost:80/r/quwjDP4us nginx सफलतापूर्वक मेरे अनुरोध को मेरे आवेदन पर पुनर्निर्देशित करता है, लेकिन आँकड़ों के लिए पृष्ठभूमि में दूसरा अनुरोध नहीं करता है। मुझे किसकी याद आ रही है?

नोट - post_action nginx डॉक्स में शामिल नहीं है, क्या कोई वैकल्पिक मॉड्यूल/निर्देश है जिसका मैं उपयोग कर सकता हूं?

4
John Doe 2 अक्टूबर 2018, 09:32

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि आपने सही उल्लेख किया है, post_action का दस्तावेजीकरण नहीं किया गया है और इसे हमेशा एक अनौपचारिक निर्देश माना गया है।

Nginx संस्करण 1.13.4 के बाद से एक नया "मिरर" मॉड्यूल प्रदान करता है, जिसका वर्णन यहां किया गया है। दस्तावेज़ीकरण में। इसलिए मैं आपको इसे आजमाने की सलाह देता हूं। आपके मामले में, यह इस तरह दिखेगा -

location /r/ {
    rewrite /r/(.*)$ http://localhost:3000/sample/route1/$1 redirect;
    mirror /stats;
}

location = /stats {
    internal;
    rewrite /sample/route1/(.*) /stats/$1;
    proxy_pass http://127.0.0.1:3000;
}

यह काम नहीं करेगा!

मैंने एक परीक्षण विन्यास बनाया है और दुर्भाग्य से यह काम नहीं करेगा। यह न तो rewrite और न ही return के लिए काम करता है। लेकिन यह proxy_pass के लिए काम करता है।

क्यों

व्याख्या इस प्रकार है। एक HTTP अनुरोध क्रमिक रूप से Nginx में प्रसंस्करण के दौरान कुछ "चरणों" से गुजरता है। बात यह है कि mirror चरण PRECONNECT में ट्रिगर हो जाता है जो चरण REWRITE से बाद में होता है जहां rewrite/return अंतिम अनुरोध प्रसंस्करण। इसलिए, mirror ट्रिगर भी नहीं होता क्योंकि इसकी प्रोसेसिंग बाद में होगी।

स्थान से फ़ाइलें प्रस्तुत करने या proxy_pass (या fastcgi_pass, आदि) के माध्यम से प्रॉक्सी करने के मामले में, प्रसंस्करण अंततः REWRITE चरण तक पहुंच जाएगा और mirror निष्पादित किया जाएगा।

चरणों का वर्णन Nginx दस्तावेज़ में यहां किया गया है।

समाधान

मुझे ट्रेड-ऑफ के बिना कोई अच्छा समाधान नहीं दिख रहा है। आप एक अतिरिक्त स्थान बना सकते हैं (रीडायरेक्ट लौटाते हुए) और /r/ से अपने अनुरोध को प्रॉक्सी कर सकते हैं, ताकि mirror ट्रिगर हो जाए। आपके बाकी कॉन्फ़िगरेशन के आधार पर ऐसा कुछ:

location /r/ {
  # you may need setting Host to match `server_name` to make sure the
  # request will be caught by this `server`.
  # proxy_set_header Host $server_name;
  proxy_pass http://<ip from listen>:<port from listen>/redirect/;
  mirror /stats;
}

location = /redirect {
  rewrite /redirect(.*)$ http://localhost:3000/sample/route1$1 redirect;
}

निश्चित रूप से यह उप-इष्टतम है और इसमें अतिरिक्त बॉयलरप्लेट है।

4
Alexander Azarov 3 अक्टूबर 2018, 10:34