আপস্ট্রিমে হোস্ট না পাওয়া গেলে ক্র্যাশ না করার জন্য এনজিনেক্স সেটআপ করুন


116

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

our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar

কনফিগারেশনটি দেখতে এরকম দেখাচ্ছে:

upstream foo {
  server foo:3000;
}

upstream bar {
  server bar:3000;
}

# and about 10 more...

server {
  listen *:80 default_server;

  server_name our_dev_server.com;

  location /foo {
      # this is specific to asset management in rails dev
      rewrite ^/foo/assets(/.*)$ /assets/$1 break;
      rewrite ^/foo(/.*)$ /foo/$1 break;
      proxy_pass http://foo;
  }

  location /bar {
      rewrite ^/bar/assets(/.*)$ /assets/$1 break;
      rewrite ^/bar(/.*)$ /bar/$1 break;
      proxy_pass http://bar;
  }

  # and about 10 more...
}

যদি এই অ্যাপগুলির মধ্যে একটি চালু না হয় তবে এনজিনেক্স ব্যর্থ হয়ে থামবে:

host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6

আমাদের সবগুলি আপ হওয়ার দরকার নেই তবে এনজিনেক্স অন্যথায় ব্যর্থ হয়। এনগিনেক্স কীভাবে ব্যর্থ প্রবাহকে উপেক্ষা করবেন?


1
আপনি কি অ্যাপ কনটেইনারগুলিকে এনগিনেক্স পাত্রে যুক্ত করছেন, বা এগুলি একে অপরের থেকে পৃথকভাবে চালাচ্ছেন? যদি upstreamব্লকের মধ্যে থাকা হোস্টটি রানটাইমের সময় সমাধান না করে তবে Nginx উপরের ত্রুটিটি দিয়ে প্রস্থান করবে ...
জাস্টিন

1
আপনি যদি কোনও আইপি ব্যবহার করতে পারেন তবে এটি সূক্ষ্ম সূচনা হবে। আপনার ক্ষেত্রে resolver( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) কাজ ব্যবহার করবেন ?
জাস্টিন

@ জাস্টিন আমাদের পৃথক ধারক, এনগিনেক্সের প্রতিটি অ্যাপ রয়েছে। তাদের ডকারের সাথে লিঙ্ক করুন
মোরোজভ

@ জাস্টিন স্টার্টআপ অর্ডার ঠিক আছে, অন্যান্য অ্যাপ্লিকেশনগুলির পরে এনজিনেক্স শুরু হয়। আমরা কেবল তাদের মধ্যে কয়েকটি চালাতে চাই :)
মরোজভ

1
আমি একটি অনুরূপ সেটআপ পেয়েছি (অ্যাপ কনটেইনার সহ এনগিনেক্স ধারক) । আমরা একটি এনগিনেক্স চিত্র তৈরি করেছি যার মধ্যে একটি proxy.shস্ক্রিপ্ট রয়েছে যা পরিবেশের ভেরিয়েবলগুলি পড়বে এবং upstreamপ্রতিটিটির জন্য গতিশীলভাবে এন্ট্রি যুক্ত করে, তারপরে এনগিনেক্স শুরু হয়। এটি এতে দুর্দান্ত কাজ করে যখন আমরা আমাদের প্রক্সি ধারকটি চালাই আমরা রানটাইমের সময় প্রয়োজনীয় প্রবাহগুলিতে যেতে পারি। প্রবর্তনের সময় নির্দিষ্ট প্রবাহগুলি সক্ষম / অক্ষম করার জন্য আপনি অনুরূপ কিছু করতে পারেন (বা আমার সেটআপ যেমন রানটাইমের সময় প্রয়োজনীয়গুলি যোগ করুন)
জাস্টিন

উত্তর:


90
  1. আপনি যদি একটি স্ট্যাটিক আইপি ব্যবহার করতে পারেন তবে কেবল এটি ব্যবহার করুন, এটি শুরু হয়ে যাবে এবং 503যদি কোনও প্রতিক্রিয়া না দেখায় তবে তা ফিরে আসবে ।

  2. resolverহোস্টটিকে সমাধান করতে পারে এমন কোনও দিকে নির্দেশ করার জন্য নির্দেশিকাটি ব্যবহার করুন , বর্তমানে এটি আপ না থাকুক না কেন।

  3. locationস্তরটি সমাধান করুন , যদি আপনি উপরেরটি না করতে পারেন (এটি Nginx শুরু / চালানোর অনুমতি দেবে) :

    location /foo {
      resolver 127.0.0.1 valid=30s;
      # or some other DNS (you company/internal DNS server)
      #resolver 8.8.8.8 valid=30s;
      set $upstream_foo foo;
      proxy_pass http://$upstream_foo:80;
    }
    
    location /bar {
      resolver 127.0.0.1 valid=30s;
      # or some other DNS (you company/internal DNS server)
      #resolver 8.8.8.8 valid=30s;
      set $upstream_bar foo;
      proxy_pass http://$upstream_bar:80;
    }
    

1
আপনার বিকল্প 3 আমার জন্য দুর্দান্ত কাজ করে। আমি যদি কোনও রেজলভার নির্দিষ্ট না করি, আপনি কি জানেন যে এনজিঙ্ক্স কতক্ষণ পর্যন্ত এটি সমাধান করে আইপি ক্যাশে করবে?
রিলে লার্ক

14
ধন্যবাদ! কেবলমাত্র একটি ভেরিয়েবল ব্যবহার করে মনে হয়
এনজিনেক্সকে

1
আমি দেখতে পেয়েছি যে একটি রেইজেক্স ক্যাপচার গ্রুপ আমাকে ভেরিয়েবলটি এড়িয়ে যাওয়ার অনুমতি দিয়েছে:location ~ ^/foo/(.*)$ { proxy_pass http://foo/$1; }
ড্যানি কার্চমিয়ার

2
এটি টিসিপি প্রক্সিটির জন্য কীভাবে কাজ করে? মনে হচ্ছে টিসিপি প্রক্সিটির জন্য বিকল্প 3 চেষ্টা করার কোনও উপায় নেই।
krish7919

1
@ চার্লি এই জাতীয় ত্রুটিগুলি এনজিনেক্সে প্রায়শই সর্বদা নিখোঁজ সম্পর্কিত ";" লাইনের শেষে সাইন করুন :)
স্টিভবি

18

আমার জন্য, @ জাস্টিন / @ ডাস্কউফের উত্তরের 3 বিকল্পটি সমস্যার সমাধান করেছে, তবে আমাকে রেজোলার আইপি 127.0.0.11 (ডকারের ডিএনএস সার্ভার) এ পরিবর্তন করতে হয়েছিল:

location /foo {
  resolver 127.0.0.11 valid=30s;
  set $upstream_foo foo;
  proxy_pass http://$upstream_foo:80;
}

location /bar {
  resolver 127.0.0.11 valid=30s;
  set $upstream_bar foo;
  proxy_pass http://$upstream_bar:80;
}

তবে @ জাস্টিন / @ ডাস্কউফ হিসাবে উল্লেখ করা হয়েছে, আপনি অন্য যে কোনও বাহ্যিক ডিএনএস সার্ভার ব্যবহার করতে পারেন।


15

ব্যবহারের প্রধান সুবিধাটি upstreamহ'ল বিভিন্ন পোর্টে শোনার চেয়ে সার্ভারের একটি গ্রুপ নির্ধারণ করা এবং তাদের মধ্যে লোড-ব্যালেন্সিং এবং ফেইলওভার কনফিগার করা ।

আপনার ক্ষেত্রে আপনি প্রতি প্রবাহের জন্য কেবলমাত্র 1 টি প্রাথমিক সার্ভারের সংজ্ঞা দিচ্ছেন তাই এটি অবশ্যই আপ হওয়া উচিত

পরিবর্তে, আপনার proxy_pass(এস) এর জন্য ভেরিয়েবলগুলি ব্যবহার করুন এবং টার্গেট সার্ভারটি ডাউন থাকাকালীন আপনি যে সম্ভাব্য ত্রুটিগুলি (404s, 503s) হ্যান্ডেল করতে পারেন তা মনে রাখবেন।


1
> পরিবর্তে, আপনার প্রক্সি_পাস (এসএস) এর জন্য ভেরিয়েবলগুলি ব্যবহার করুন এবং টার্গেট সার্ভার ডাউন থাকাকালীন আপনি যে সম্ভাব্য ত্রুটিগুলি (404, 503 গুলি) পেতে পারেন তা হ্যান্ডেল করতে মনে রাখবেন। আপনি কীভাবে এটি ব্যাখ্যা করতে পারেন? যদি আমি foo "upstream" করি set $variable http://fooএবং রাখি proxy_pass $variable(আপনি যে সুবিধাগুলি উল্লিখিত সুবিধাগুলি বজায় রাখতে পারেন) তবে আমি এখনও ওপি দ্বারা উল্লিখিত সমস্যাটিকে আঘাত করছি।
টিবোর ভাস

6
আপনি অন্যান্য উদাহরণগুলিতে দেখতে পাচ্ছেন, এটি হবে set $variable fooএবংproxy_pass http://$variable
ডানিয়েলপাম

2
@ ড্যানিয়েলগপিএম যেমন আপনি বলেছেন, প্রক্সি_পাসের জন্য ভেরিয়েবলটি পুরোপুরি কাজ করে এবং আমার সমস্যা সমাধান করে। আপনি নিজের উত্তর আপডেট করতে এবং উদাহরণ হিসাবে উল্লেখ করতে
পারলে

3
আমার যদি একাধিক লোক থাকে এবং আমি যেগুলি সমাধান করতে পারি না সেগুলি উপেক্ষা করতে চাই?
শে

0

আমার একই "হোস্ট পাওয়া যায় নি" সমস্যাটি ছিল কারণ এর $uriপরিবর্তে আমার হোস্টের কিছু অংশ ম্যাপ করা হচ্ছে $request_uri:

proxy_pass http://one-api-service.$kubernetes:8091/auth;

এবং যখন অনুরোধটি অনুমোদনের ক্ষেত্রে পরিবর্তিত হয়েছিল, তখন $uriএটির প্রাথমিক মানটি হারাবে । আমার সমস্যা সমাধানের $request_uriপরিবর্তে ম্যাপিংটি ব্যবহার করার জন্য পরিবর্তন $uriকরা:

map $request_uri $kubernetes {
    # ...
}

-8

আপনি --linkবিকল্পটি ব্যবহার করতে পারবেন না , পরিবর্তে আপনি পোর্ট ম্যাপিং ব্যবহার করতে পারেন এবং হোস্টিং ঠিকানার জন্য এনজিনেক্স বেঁধে রাখতে পারেন।

উদাহরণ: -p 180:80বিকল্পের সাথে আপনার প্রথম ডকার ধারক, বিকল্প সহ দ্বিতীয় ধারক চালান -p 280:80

এনজিনেক্স চালান এবং প্রক্সিটির জন্য এই ঠিকানাগুলি সেট করুন:

proxy_pass http://192.168.1.20:180/; # first container
proxy_pass http://192.168.1.20:280/; # second container
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.