অনুরোধ পদ্ধতির দ্বারা এনগিনেক্স প্রক্সি


17

এটি কীভাবে সম্ভব / অনুরোধ পদ্ধতির উপর নির্ভর করে (যেমন। জিইটি / পোষ্ট) এনজিঙ্ক্স অবস্থান ব্লককে বিভিন্ন ব্যাক-এন্ডে প্রক্সিতে কনফিগার করতে পারি?

কারণটি হ'ল, আমি বর্তমানে 2 টি পৃথক ইউআরএলগুলিতে 2 টি পদ্ধতি পরিচালনা করছি (একটি 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;
  }
}

যদি আপনার নিজের অ্যাপ্লিকেশনটি লেখা হয় তবে আপনি এতে জিইটি / পোষ্ট পরীক্ষা করতে এবং এক্স-অ্যাক্সেল-পুনর্নির্দেশ শিরোনামগুলি ফাইলগুলি এনজিএনএক্সে স্থানান্তর করতে প্রেরণ করতে পারেন।


জিইটি ব্লকটি আমার ক্ষেত্রে একটি প্রক্সি_পাস, তবে অন্যথায় এটি কার্যকর হয়। এই মুহুর্তে আমি ব্লক যদি দ্বিতীয়টি ব্যবহার করছি না, ফাস্টসিগি_পাস নির্দেশটি পৌঁছেছে তখন এনজিন্স "প্রসেসিং" বন্ধ করে দিবে বলে মনে হচ্ছে (যেমন, প্রক্সি পাসের মধ্য দিয়ে পড়া এবং না চালানোও) কারণ আমি পোষ্ট ছাড়া অন্য কিছু চাই না প্রক্সি যাও।
ব্রেন্টন অ্যালকার

2
লক্ষ্য করুন ifসাধারণত nginx ডকুমেন্টেশন দ্বারা নিরুৎসাহিত হয়: nginx.com/resources/wiki/start/topics/depth/ifisevil
vog

1
সুতরাং, বিকল্প কি?
WM

1
: @WM আমার উত্তর দেখুন serverfault.com/a/823053/175421
vog

@ ভোগ, আকর্ষণীয়। এটি করার জন্য দুর্দান্ত স্মার্ট উপায়। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
WM

23

যদিও আপনি এটি দিয়ে এটি অর্জন করতে পেরেছিলেন if, এটি সাধারণত এনগিনেক্স ডকুমেন্টেশন দ্বারা নিরুৎসাহিত করা হয় , কারণ ifঅন্যান্য নির্দেশের সাথে ভাল খেলেন না। উদাহরণস্বরূপ, ধরে নিই যে জিইটি সবার জন্য উন্মুক্ত হওয়া উচিত, যখন পিওএসটি কেবলমাত্র HTTP বেসিক অথথ ব্যবহার করেই অনুমোদনপ্রাপ্ত ব্যবহারকারীদের জন্য। এটির ifসাথে একত্রিত হওয়া auth_basicদরকার যা সঠিকভাবে কাজ করে না।

এখানে একটি বিকল্প রয়েছে যা ছাড়াই কাজ করে if। কৌশলটি হ'ল "জিইটি" এবং "পোষ্ট" প্রবাহের নামের অংশ হিসাবে ব্যবহার করা, যাতে এগুলি পরিবর্তনশীল প্রতিস্থাপনের মাধ্যমে সমাধান করা যেতে পারে:

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

GET ব্যতীত অন্য কিছুর জন্য এইচটিটিপি বেসিক এথের সাথে এটি একত্রিত করতে, কেবল একটি 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
@ জেমস: এটি সম্ভবত একটি নতুন প্রশ্ন হিসাবে চিহ্নিত করা হবে, এটি একটি প্রশ্ন উল্লেখ করে। এই বিশদটির জন্য আমার কাছে উত্তর নেই, তবে অন্যের কাছেও থাকতে পারে।
vog

0

আমার কাজগুলি করার জন্য আমি এটি করেছি

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

নিড়ানি অনুরোধ পদ্ধতির উপর ভিত্তি করে ঠিক যে দুটি শেষ পয়েন্টের মধ্যে স্যুইচ করে?
বেসিক

0

অপশন, পুট, ইত্যাদি ইত্যাদির জন্য একটি ডিফল্ট হ্যান্ডলার অন্তর্ভুক্ত করতে ভোগের উত্তরে সামান্য পরিবর্তন

    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

আমি @ টিএমএমএমমি থেকে কাজ করে উত্তর পেতে পারি না, তবে এটি আমাকে মানচিত্রের ডকুমেন্টেশনের দিকে নির্দেশ করেছে এবং এটি আমার পক্ষে কাজ করেছে:

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