सवाल Nginx में स्थान के तहत एकाधिक प्रॉक्सी एंडपॉइंट्स की सेवा करना


मेरे पास कुछ एपीआई एंडपॉइंट्स हैं जो मैं एक ही स्थान से सेवा करना चाहता हूं /api subpaths विभिन्न अंतराल पर जा रहा है के साथ। विशेष रूप से, मैं चाहता हूं कि वेबडीस उपलब्ध हो /api और एक मालिकाना एपीआई उपलब्ध है /api/mypath

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

यहां मेरे परीक्षण सर्वर से कॉन्फ़िगरेशन फ़ाइल है जिसे मैं हैकिंग कर रहा हूं:

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # temporary hardcoded workaround
  location = /api/mypath/about {
    proxy_pass http://localhost:3936/v1/about;
  }

  location /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }

  # tried this but it gives "not found" error
  #location ^~ /api/mypath/ {
  #  rewrite ^/api/mypath/(.*)$ /$1 break;
  #  proxy_pass http://localhost:3936/v1/;
  #}
  #
  #location ^~ /api {
  #  rewrite ^/api/(.*)$ /$1 break;
  #  proxy_pass http://localhost:7379/;
  #}
}

मैं अपना कामकाज कैसे बदल सकता हूं ताकि कोई अनुरोध हो /api/mypath/* पोर्ट 3 9 36 पर एंडपॉइंट पर जायेगा, और बाकी सब कुछ पोर्ट 737 9 पर होगा?


7
2017-12-08 22:44


मूल


आपका क्या मतलब है tried this to no avail? क्या हुआ जब आप उस स्थान निर्देश को सक्षम करते हैं? कनेक्शन का समय समाप्त? स्थान मेल नहीं खाता? - masegaloeh
आह के लिए धन्यवाद धन्यवाद, यह कोई त्रुटि नहीं दे रहा है, आगे की जांच पर ऐसा लगता है कि मेरी एपीआई से त्रुटि आ रही है, इसलिए यह काम कर रहा है! : डी लेकिन पुनर्लेखन नियम स्पष्ट रूप से नहीं है क्योंकि मुझे URL में v1 जोड़ना है (स्थानीय होस्ट / API / mypath / v1 / के बारे में) ... :( - hamstar


जवाब:


इसके लिए आपको पुनः लिखने की आवश्यकता नहीं है।

server {
  ...

  location ^~ /api/ {
    proxy_pass http://localhost:7379/;
  }
  location ^~ /api/mypath/ {
    proxy_pass http://localhost:3936/v1/;
  }
}

इसके अनुसार nginx दस्तावेज

किसी स्थान को या तो उपसर्ग स्ट्रिंग द्वारा या नियमित अभिव्यक्ति द्वारा परिभाषित किया जा सकता है। नियमित अभिव्यक्ति पिछले के साथ निर्दिष्ट हैं ~* संशोधक (केस-असंवेदनशील मिलान के लिए), या ~ संशोधक (केस-संवेदनशील मिलान के लिए)। किसी दिए गए अनुरोध से मेल खाने वाले स्थान को ढूंढने के लिए, nginx पहले उपसर्ग स्ट्रिंग (उपसर्ग स्थान) का उपयोग करके परिभाषित स्थानों की जांच करता है। उनमें से, सबसे लंबे मिलान वाले उपसर्ग वाले स्थान का चयन और याद किया जाता है। फिर कॉन्फ़िगरेशन फ़ाइल में उनकी उपस्थिति के क्रम में नियमित अभिव्यक्तियों की जांच की जाती है। नियमित अभिव्यक्तियों की खोज पहले मैच पर समाप्त होती है, और संबंधित कॉन्फ़िगरेशन का उपयोग किया जाता है। यदि नियमित अभिव्यक्ति के साथ कोई मिलान नहीं मिलता है तो पहले याद किए गए उपसर्ग स्थान की कॉन्फ़िगरेशन का उपयोग किया जाता है।

यदि सबसे लंबा मिलान करने वाला उपसर्ग स्थान है ^~ संशोधक तब नियमित अभिव्यक्तियों की जांच नहीं की जाती है।

इसलिए कोई भी अनुरोध जो शुरू होता है /api/mypath/ हमेशा के बाद से दूसरे ब्लॉक द्वारा परोसा जाएगा सबसे लंबा मिलान उपसर्ग स्थान।

कोई भी अनुरोध जो शुरू होता है /api/ तुरंत पीछा नहीं किया mypath/ हमेशा पहले ब्लॉक द्वारा परोसा जाएगा, क्योंकि दूसरा ब्लॉक मेल नहीं खाता है, इसलिए पहला ब्लॉक बना रहा है सबसे लंबा मिलान उपसर्ग स्थान।


12
2017-12-09 07:15



यदि आप स्थान संशोधक को देखते हैं (=, ~*, ~, तथा ^~) यह काउंटर-अंतर्ज्ञानी प्रतीत हो सकता है ^~ नियमित अभिव्यक्तियों को छोड़कर (तब से ~ एक नियमित अभिव्यक्ति मैच इंगित करता है) ... हालांकि, अगर आपको याद है, ^ एक रेगेक्स चरित्र वर्ग के अंदर (उदा। [^a-z]) नकारता वह वर्ग (जैसे कि उदाहरण का मतलब है (कोई भी चरित्र के सिवाय ए-जेड से); इसी तरह, ^~ किसी भी संभावित नियमित अभिव्यक्ति स्थान ब्लॉक को अस्वीकार करता है। - Doktor J


ठीक है, इसे समझ लिया, मैंने सोचा कि "नहीं मिला" त्रुटि nginx से आ रही थी, लेकिन वास्तव में यह मेरे एपीआई से आ रही थी। यदि कोई दिलचस्पी लेता है तो यह मेरा समाधान है:

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # automatically go to v1 of the (grape) API
  location ^~ /api/mypath/ {
    rewrite ^/api/mypath/(.*)$ /v1/$1 break;
    proxy_pass http://localhost:3936/;
  }

  location ^~ /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }
}

6
2017-12-08 23:19