প্রশ্ন Reverseproxying যখন আপস্ট্রিম হোস্ট নাম পাস করতে nginx করুন


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

web1.local web2.local web3.local

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

    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;
      }
    }

এখন, কারণ কনটেইনারগুলি "web1.local" এর পরিবর্তে হোস্টনামটি "প্রধান" পায় তবে অনুরোধে তারা সঠিকভাবে সাড়া দেয় না।

প্রশ্নঃ হোস্টে সার্ভারের আপস্ট্রিম গ্রুপের নামের পরিবর্তে আপস্ট্রিম সার্ভারের নাম পাস করতে আমি nginx কে বলতে পারি: হেডার যখন অনুরোধ প্রক্সি করার সময়?


71
2018-05-23 20:46


উত্স


আমি মনে করতে পারছি না। কেন আপনি আপনার ব্যাকেন্ড সার্ভার প্রধান বা example.com সাড়া না? এটা ব্যাকঅ্যান্ড কে জানে না, তাই না এটা হয়। বিপরীতটি সহজেই সম্ভব: proxy_set_header হোস্ট $ হোস্ট; মূল অনুরোধ থেকে হোস্টনাম সহ আপস্ট্রিম থেকে ফিরে আসা যে কোন হোস্ট ভেরিয়েবল প্রতিস্থাপন করবে। - Andrew Domaszek
সঠিক জিনিসটি আবেদনটি ঠিক করতে হয়। - Michael Hampton♦


উত্তর:


আসলে আপনি proxy_set_header এর মাধ্যমে এটি করতে পারেন।

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

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

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;
  }
}

88
2018-05-24 08:10



proxy_set_header এক্স-ফরোয়ার্ড- $ proxy_add_x_forwarded_for জন্য; ভাল মনে হচ্ছে - sivann
@ পাভেলঃ বুঝেছি। আসলে আমি কিছু গবেষণা এবং কিছু পরীক্ষা করেনি। মনে হচ্ছে আপনার প্রয়োজন পূরণের কোনও সোজা পদ্ধতি নেই। তাই এমনকি একটি "bastardized" সমাধান একটি সমাধান। আমি এটা করতে চাই না কেন আপনি এটা করতে চান। আমি আপনার কারণ আছে নিশ্চিত। :-) - Jens Bradler
@ জেনস ব্রেডলার আপনি আমার চেয়ে বেশি বিশেষজ্ঞ বলে মনে করেন, আপনি আমাকে আমার সমাধান সম্পর্কে কী ভাবতে পারেন? আমি একই কাজ করতে চাই কারণ আমি আমার আইএসপির দুটি অ্যাকাউন্ট থেকে আমার ওয়েবসাইটের দুটি কপি চালাচ্ছি: site1.myisp.com এবং site2.myisp.com এবং তারা শুধুমাত্র তাদের নিজ নিজ নাম সাড়া। আমি এখন আমার ডোমেন নামটি মালিক এবং আমি আমার সার্ভারের ভারসাম্য লোড করতে আমার আইএসপি ওয়েবসাইটটি ব্যবহার করতে চাই। যে একটি ভাল কারণ না? আপনাকে অনেক ধন্যবাদ ;) - ncenerar
@ এনসেননার আপনি এটি করতে পারেন কিন্তু এটি আপনাকে ব্যর্থতার একক পয়েন্টে নিয়ে আসবে: লোড ব্যালান্সার। যদি লোড ব্যালান্সিং (অকার্যকর নয়) এর জন্য আপনি DNS ভিত্তিক লোড ব্যালেন্সিংটি DNS ফায়ারওভারের সাথে সমন্বয় করতেও ব্যবহার করতে পারেন। - Jens Bradler
এই উত্তর প্রতিফলিত সরকারী ব্লগ পরামর্শ। - Bernard Rosset


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

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;
  }
}

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


21
2017-08-20 15:20



আমি মূলত লুয়া পদ্ধতি ব্যবহার করেছিলাম, কিন্তু এখন সম্পূর্ণরূপে হ্যাপ্রক্সিতে স্যুইচ করেছি যা আমি স্ট্যান্ডার্ড কনফিগারেশন দিয়ে যা চেয়েছি তা ঠিক করতে সক্ষম। - pavel_karoukin


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

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
2018-05-24 13:39





আমরা এই মত একটি পৃথক হেডার হিসাবে আপস্ট্রিম অ্যাড্রেস মধ্যে পাস

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
2018-04-26 17:49





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

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


1
2018-06-23 01:06