বিপরীতমুখী করার সময় প্রবাহের হোস্টনামটি পাস করার জন্য এনগিনেক্স করুন


89

আমি হোস্টনাম সহ বেশ কয়েকটি ডকার পাত্রে চালাচ্ছি:

web1.local web2.local web3.local

এগুলি এনজিএনএক্স দ্বারা হোস্টনামের ভিত্তিতে করা হয়েছে R আমার এই সেটআপের সামনে একটি প্রক্সি রয়েছে (ইন্টারনেটের সাথে সংযুক্ত বিভিন্ন মেশিনে) যেখানে আমি প্রবাহটিকে এভাবে সংজ্ঞায়িত করেছি:

    upstream main {
      server web1.local:80;
      server web2.local:80;
      server web3.local:80;
    }

এবং প্রকৃত ভার্চুয়াল হোস্টের বিবরণ:

    server {
      listen 80;
      server_name example.com;
      location / {
        proxy_pass http://main;
      }
    }

এখন, যেহেতু পাত্রে "ওয়েব 1.লোকাল" এর পরিবর্তে হোস্টনাম "মূল" পাওয়া যায়, তারা অনুরোধটির সঠিকভাবে প্রতিক্রিয়া জানায় না।

প্রশ্ন: প্রক্সিং অনুরোধ করার সময় আমি কীভাবে এনজিঞ্জকে হোস্টে শিরোনামের সার্ভারের গ্রুপের পরিবর্তে প্রবাহের সার্ভারের নাম পাসওয়ার্ড করতে বলব?


3
আমি মনে করি না আপনি পারবেন। আপনি কেন প্রধান বা উদাহরণ ডটকমকে সাড়া দেওয়ার জন্য আপনার ব্যাকএন্ড সার্ভার সেট করবেন না? এটা তোলে যেন ব্যাকএন্ড জানে না যারা নয় এটা হয়। বিপরীতটি সহজেই সম্ভব: প্রক্সি_সেট_হেডার হোস্ট $ হোস্ট; মূল অনুরোধ থেকে হোস্টনামের সাথে প্রবাহ থেকে ফিরে আসা কোনও হোস্ট ভেরিয়েবল প্রতিস্থাপন করবে।
অ্যান্ড্রু ডোমাসেক

যথাযথ জিনিসটি হ'ল অ্যাপ্লিকেশনটি ঠিক করা।
মাইকেল হ্যাম্পটন

উত্তর:


109

প্রকৃতপক্ষে আপনি এটি প্রক্সি_সেট_হেডারের মাধ্যমে করতে পারেন।

আরও তথ্যের জন্য এখানে দেখুন: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header বা ব্যবহারের একটি উদাহরণ এখানে দেখুন: https://stackoverflow.com/questions/12847771/configure-nginx- সঙ্গে-প্রক্সি-পাস

আমি আপনার উপরের পোস্ট কনফিগারেশনে গতিশীল পদ্ধতির অন্তর্ভুক্ত করেছি:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

স্থির হোস্টের নাম সহ এখানে একটি উদাহরণ রয়েছে:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            www.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

7
প্রক্সি_সেট_হেডার এক্স-ফরওয়ার্ড-ফর $ প্রক্সি_অ্যাড_এক্স_ ফরওয়ার্ড_এর জন্য; আরও ভাল বলে মনে হচ্ছে
সিভান

1
@ পাভেল: বুঝেছি আসলে আমি কিছু গবেষণা এবং কিছু পরীক্ষাও করেছি। দেখে মনে হচ্ছে আপনার প্রয়োজনীয়তা পূরণের জন্য কোনও সোজা পদ্ধতি নেই। সুতরাং এমনকি "জারজুটেড" সমাধানও একটি সমাধান। আপনি কেন এটি করতে চান তা জিজ্ঞাসা করতে আমি পছন্দ করি না। আমি নিশ্চিত যে আপনার কারণ আছে। :-)
জেনস ব্র্যাডলার

@ জেনস ব্র্যাডলার আপনার চেয়ে আমার চেয়ে বেশি বিশেষজ্ঞ মনে হচ্ছে, আমার সমাধান সম্পর্কে আপনি কী ভাবেন? আমি আমি আমার আইএসপি দুটি অ্যাকাউন্ট থেকে আমার ওয়েবসাইট দুটি অনুলিপি চালানোর একই কাজ করতে চাই: site1.myisp.comএবং site2.myisp.comএবং তারা শুধুমাত্র তাদের নিজ নিজ নাম সাড়া। আমি এখন আমার ডোমেন নামটির মালিক এবং আমি আমার সার্ভারগুলির ভারসাম্য লোড করতে আমার আইএসপি ওয়েবসাইটটি ব্যবহার করতে চাই। এটা কি ভাল কারণ নয়? আপনাকে অনেক ধন্যবাদ;)
ncenerar

1
@ অনারার আপনি এটি করতে পারেন তবে এটি আপনাকে ব্যর্থতার একক পয়েন্টে নিয়ে আসবে: লোড ব্যালেন্সার। এটি যদি লোড ব্যালেন্সিংয়ের জন্য হয় (অতিরিক্ত কাজ নয়) আপনি DNS ফেলওভারের সাথে একত্রে DNS ভিত্তিক লোড ব্যালেন্সিং ব্যবহার করতে পারেন use
জেনস ব্র্যাডলার


28

আমার একই সমস্যা ছিল এবং শেষ পর্যন্ত আমি দুটি স্তরের প্রক্সি ব্যবহার করে এটি সমাধান করেছি। আপনার পরিস্থিতির জন্য আপনি কীভাবে এটি করতে পারেন তা এখানে (আমার মনে হয়):

server {
  listen      8001 default_server;
  server_name web1.example.com;
  location / {
    proxy_pass       http://web1.local:80;
    proxy_set_header Host web1.local:80;
  }
}

server {
  listen      8002 default_server;
  server_name web2.example.com;
  location / {
    proxy_pass       http://web2.local:80;
    proxy_set_header Host web2.local:80;
  }
}

server {
  listen      8003 default_server;
  server_name web3.example.com;
  location / {
    proxy_pass       http://web3.local:80;
    proxy_set_header Host web3.local:80;
  }
}

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen      80;
  server_name example.com;
  location / {
    proxy_pass http://main;
  }
}

আপনি দেখতে পাচ্ছেন, কৌশলটি হ'ল একটি স্থানীয় সার্ভার তৈরি করা যা কোনও নির্দিষ্ট পোর্টকে প্রতিক্রিয়া জানায় যা প্রতিটি সার্ভারের জন্য সঠিক হোস্টটি পুনরায় লিখে সার্ভারকে প্রক্সি করবে। তারপরে, আপনি এই স্থানীয় সার্ভারগুলি আপনার প্রবাহে ব্যবহার করতে পারেন এবং শেষ পর্যন্ত প্রকৃত প্রক্সিটিতে সেই প্রবাহটিকে ব্যবহার করতে পারেন।


আমি প্রথমে লুয়া পদ্ধতির ব্যবহার করেছি, তবে এখন পুরোপুরি HAProxy এ স্যুইচ করেছি যা স্ট্যান্ডার্ড কনফিগারেশনের সাথে আমি যা চাইছিলাম তা করতে দেয়।
পাভেল_কৌরুকিন

3

সুতরাং এনজিনেক্সের জন্য সমস্ত ডকুমেন্টেশন পড়া থেকে (আমি সত্যই আপস্ট্রিম মডিউলটির কোডটি পার্স করতে পারি না = () আমি এই জঘন্য সমাধানটি নিয়ে এসেছি Unfortunately দুর্ভাগ্যক্রমে এই সমাধানটি ব্যর্থ হোস্টদের ট্র্যাক রাখে না, তবে কেবল এলোমেলোভাবে নির্বাচন করুন এবং এটিতে অনুরোধটিকে পুনর্নির্দেশ করুন। সুতরাং সমস্ত ব্যাক-এন্ড চলমান আছে তা নিশ্চিত করতে আমাকে এক ধরণের মনিটরিং সেটআপ করতে হবে।

server {
        listen 80;
        server_name example.com;
        resolver 127.0.0.1;

        location / {
                set $upstream "";
                rewrite_by_lua '
                        local upstreams = {
                                "http://web1.dokku.localdomain",
                                "http://web2.dokku.localdomain",
                                "http://web3.dokku.localdomain",
                                "http://web4.dokku.localdomain"
                        }
                        ngx.var.upstream = upstreams[ math.random( #upstreams ) ] 
                ';
                proxy_pass $upstream;
        }
}

2

আমরা এই জাতীয় প্রান্তের অ্যাডারে পৃথক শিরোনাম হিসাবে পাস করি

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Upstream      $upstream_addr;
  }
}

আপনি যদি চেষ্টা করেন?

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $upstream_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Host          $host;
  }
}

2

লক্ষ্যটি যৌক্তিক বলে মনে হচ্ছে, এনগিনেক্স প্রবাহের সাথে মেলে হোস্ট: শিরোনাম পরিবর্তন করবে না । পরিবর্তে, এটি upstreamডোমেন নামগুলিকে CNAMEডিএনএস-এর মতো আচরণ করে - কোনও আইপি ঠিকানায় যাওয়ার উপায় হিসাবে।

অনুরোধ শিরোনামগুলি (এবং বডি) আপস্ট্রিমটি নির্বাচনের আগে স্থির করা হয়েছে। প্রবাহটি মধ্য-অনুরোধটি পরিবর্তন করতে পারে যদি এটি নির্দিষ্ট প্রবাহকে অ-প্রতিক্রিয়াশীল হিসাবে দেখা যায় তবে অনুরোধটি পরিবর্তন হয় না।


0

হুম। আমার একটি অনুরূপ সেটআপ আছে, যা আমি সহজভাবে সম্পন্ন করেছি

location / {
    ... 
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_pass ...;
}

(সার্ভারের হোস্টনাম কনফিগারেশন) এর $http_hostপরিবর্তে এখানে $host( আগত অনুরোধ থেকে HTTP হোস্ট শিরোলেখের ব্যবহার ) আমার পরীক্ষায় ক্লায়েন্ট দ্বারা পাস করা একই হোস্ট শিরোনামকে আমার পরীক্ষায় প্রবাহিত করে।

এছাড়াও https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy দেখুন ।


0

অন্যান্য লোকেরা ইতিমধ্যে স্ক্রিপ্ট ভেরিয়েবল (যেমন $ আপস্ট্রিম) ব্যবহার করে পোস্ট করেছে, আপনি এটি আপনার পছন্দ মতো সেট করতে পারেন এবং এটি অতিরিক্ত শিরোনাম হ্যাকিং ছাড়াই সমস্যাটি ঠিক করবে।

প্রক্সি পাস হ্যান্ডলারের হুমকি স্ক্রিপ্ট ভেরিয়েবলগুলি অন্যভাবে, যদি কোনও মান শর্তাধীন না হয় (নামটিতে $ থাকে না) কনফিগারেশন পর্যায়ে প্রবাহে ব্যাক আপ করা হয় এবং পরে ব্যবহার করুন।

এই সমস্যাটি বাদ দেওয়ার একটি সহজ উপায় এবং প্রবাহের (ফ্রি সংস্করণ) সর্বাধিক সুবিধা রয়েছে এমন কিছু ব্যবহার করা হবে Split_Clients:

split_clients $request_uri $my_upstream {
              33%          server1.domainX.com;
              33%          server2.domainX.com;
# Always use DOT at end entry if you wonder why, read the SC code.
              *            server3.domainX.com;  
}
location / {
    ... 
    proxy_pass http://$my_upstream;
}

উপরের উদাহরণটি প্রায় উজানের মতোই দেখাচ্ছে। ম্যাপিংয়ের অন্যান্য মডিউল রয়েছে, যেমন চ্যাশ_ম্যাপ_মডিউল , তবে গাছ থেকে বের হওয়ার কারণে আপনার নিজের দ্বারা এটি তৈরি করা দরকার যা কিছু ব্যবহারের ক্ষেত্রে / সম্ভব নয়

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