এনগিনেক্সে অবস্থানের অধীনে একাধিক প্রক্সি এন্ডপয়েন্টগুলি পরিবেশন করা হচ্ছে


14

আমার কাছে বেশ কয়েকটি এপিআই এন্ডপয়েন্ট রয়েছে যা আমি /apiসাবপ্যাথগুলির সাথে একটি পৃথক পয়েন্টে যাওয়ার জন্য একটি একক অবস্থানের থেকে পরিবেশন করতে চাই । বিশেষত, আমি চাই যে ওয়েবডিস এতে পাওয়া /apiএবং একটি মালিকানাধীন এপিআই পাওয়া যায় /api/mypath

আমি ওয়েবডিস এপিআইয়ের সাথে সংঘর্ষের বিষয়ে উদ্বিগ্ন নই কারণ আমি সাবপ্যাথগুলি ব্যবহার করছি যা redis কমান্ড নামগুলির সাথে সংঘর্ষের সম্ভাবনা নেই এবং সংঘর্ষ এড়াতে এপিআইয়ের নকশার উপরও সম্পূর্ণ নিয়ন্ত্রণ রয়েছে।

আমার পরীক্ষার সার্ভারের কনফিগারেশন ফাইলটি এখানে আমি হ্যাক করছি:

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/*পোর্ট 3936 এ শেষ পয়েন্টে যায় এবং অন্য সব কিছু 737979৯ বন্দরে যায়?


আপনি কি বলতে চাইছেন tried this to no avail? আপনি যখন সেই অবস্থানের নির্দেশকে সক্ষম করেন তখন কী ঘটেছিল? আউট সংযোগ সময়? লোকেশন মিলছে না?
masegaloeh

আহ প্রম্পটের জন্য ধন্যবাদ, এটি একটি পাওয়া যায়নি ত্রুটি দিচ্ছে, আরও তদন্তে দেখা যাচ্ছে যে ত্রুটিটি আমার এপিআই থেকে আসছে তাই এটি কাজ করছে! : ডি তবে পুনর্লিখনের নিয়মটি অবশ্যই স্পষ্ট নয় কারণ আমাকে ইউআরএলটিতে ভি 1 যোগ করতে হবে ( লোকালহোস্ট / এপি / মাইপাথ / ভি 1 / প্রায় ) ... :(
হামস্টার

উত্তর:


24

এর জন্য আপনার পুনর্লিখনের দরকার নেই।

server {
  ...

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

মতে nginx ডকুমেন্টেশন

কোনও অবস্থান একটি উপসর্গের স্ট্রিং বা নিয়মিত প্রকাশের মাধ্যমে সংজ্ঞায়িত করা যায়। পূর্ববর্তী ~*সংশোধক (কেস-সংবেদনশীল মিলে যাওয়ার জন্য), বা ~সংশোধক (কেস-সংবেদনশীল মিলে যাওয়ার জন্য ) দিয়ে নিয়মিত প্রকাশগুলি নির্দিষ্ট করা হয় । প্রদত্ত অনুরোধের সাথে মিলে যাওয়া অবস্থানটি সন্ধান করতে, এনজিনেক্স প্রথমে উপসর্গের স্ট্রিংগুলি (উপসর্গের অবস্থানগুলি) ব্যবহার করে সংজ্ঞায়িত অবস্থানগুলি পরীক্ষা করে। তাদের মধ্যে, দীর্ঘতম মিলের উপসর্গের সাথে অবস্থানটি নির্বাচন করা এবং মনে রাখা হয়। তারপরে কনফিগারেশন ফাইলে তাদের উপস্থিতির ক্রম অনুসারে নিয়মিত প্রকাশগুলি পরীক্ষা করা হয়। নিয়মিত এক্সপ্রেশনগুলির অনুসন্ধান প্রথম ম্যাচে শেষ হয় এবং এটির সাথে সম্পর্কিত কনফিগারেশন ব্যবহার করা হয়। যদি নিয়মিত অভিব্যক্তির সাথে কোনও মিল না পাওয়া যায় তবে পূর্বে মনে রাখা উপসর্গের অবস্থানটি কনফিগারেশন ব্যবহার করা হয়।

যদি দীর্ঘতম মিলনের উপসর্গের অবস্থানটিতে ^~সংশোধক থাকে তবে নিয়মিত প্রকাশগুলি পরীক্ষা করা হয় না।

সুতরাং যে কোনও অনুরোধ যা শুরু হয় /api/mypath/সর্বদা দ্বিতীয় ব্লক দ্বারা পরিবেশন করা হবে যেহেতু এটি দীর্ঘতম মিলনের উপসর্গের অবস্থান।

যে কোনও অনুরোধ যা /api/তাত্ক্ষণিকভাবে অনুসরণ না করে শুরু হয় mypath/সর্বদা প্রথম ব্লক দ্বারা পরিবেশন করা হবে, যেহেতু দ্বিতীয় ব্লকের সাথে মেলে না, সুতরাং প্রথম ব্লকে সবচেয়ে দীর্ঘতম ম্যাচের উপসর্গ অবস্থান তৈরি করে।


2
আপনি অবস্থান সংশোধনকারীদের তাকান থাকেন ( =, ~*, ~, এবং ^~) এটি পাল্টা স্বজ্ঞাত বলে মনে হতে পারে যে ^~বাদ রেগুলার এক্সপ্রেশনের (যেহেতু ~একটি রেগুলার এক্সপ্রেশন ম্যাচ ইঙ্গিত) ... যাইহোক, আপনি প্রত্যাহার হলে, ^একটি Regex চরিত্র শ্রেণীর ভিতরের (যেমন [^a-z]) negates যে শ্রেণী (যেমন উদাহরণস্বরূপ উপায়ে (যে কোন চরিত্র ব্যতীত AZ থেকে যারা); একইভাবে, ^~কোনো সম্ভাব্য রেগুলার এক্সপ্রেশন অবস্থান ব্লক negates।
doktor জে

6

ঠিক আছে, এটি বুঝতে পেরেছি, আমি ভেবেছিলাম "খুঁজে পাওয়া যায়নি" ত্রুটি এনজিনেক্স থেকে আসছে তবে আসলে এটি আমার এপিআই থেকে আসছে। যদি কেউ আগ্রহী হয় তবে এটি আমার সমাধান:

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/;
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.