নামযুক্ত অবস্থানগুলির সাথে কীভাবে একটি ডিআরওয়াই, মডুলার এনজিন্স কনফ (বিপরীত প্রক্সি) লিখবেন


25

আমি বেশিরভাগ গনকন / মোড_উজি অ্যাপ্লিকেশনগুলির সামনে এবং অবশ্যই সার্ভারের স্ট্যাটিক ফাইলগুলিতে বিপরীত ক্যাচিনিং প্রক্সি হিসাবে এনগিনেক্স ব্যবহার করছি।

আমি দেখতে পাই যে দ্রুত আমার এনজিএনএক্স কনফিডগুলি বজায় রাখা অসম্ভব হয়ে পড়ে; সমস্যাটি হ'ল আমার কাছে কয়েকটি প্যাটার্ন রয়েছে যা একই রকম (বা এমনকি অভিন্ন) তবে আমি এটি পরিষ্কার করার জন্য পরিচালনা করতে পারি না।

আমার কাছে সবচেয়ে বড় সমস্যাটি হ'ল আমি কনফিডগুলির একটি গোষ্ঠী গোছানোর জন্য নামকরণ করা অবস্থানগুলি ব্যবহার করতে পছন্দ করব eg

location @django_modwsgi {
    include proxy.conf;
    proxy_pass  http://127.0.0.1:8080;        
}

location @django_gunicorn {
    include proxy.conf; # this could also be included directly in the server {} block?
    proxy_pass  http://gunicorn_builder;
}

বিশেষ দ্রষ্টব্য। ইস্যু করা হয় না উভয় gunicorn এবং wsgi হচ্ছে। এটি কেবল একটি উদাহরণ। আর একটি হ'ল:

location @namedlocation_1 {
     some cache settings;
     some cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

location @namedlocation_2 {
     other cache settings;
     other cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

তবে একটি নামকৃত স্থানে কল করার জন্য কেবলমাত্র আমি খুঁজে পেয়েছি:

location /somelocation {
    try_files $uri @named_location;
}

এটি ইতিমধ্যে ঠিক মনে হচ্ছে না, আমি চাই না যে nginx স্থির ফাইলগুলি সন্ধান করুন, আমি এটি সরাসরি নামক স্থানে যেতে চাই! কোনও নামকৃত স্থানকে সরাসরি "কল" করার কোনও উপায় আছে ?!

আমি শুকনো যেতে যেতে ভেবেছিলাম অন্য উপায় হ'ল প্রচুর include...

location /somelocation {
    include django_unicorn.conf;
}

তবে এটি কি এটি করার একটি ভাল উপায়? এটি খুব জেনেরিক সেটিংসের জন্য ঠিক আছে (উদাহরণস্বরূপ, প্রক্সি বেশী), তবে সম্পূর্ণ কনফারেন্স পেতে বিভিন্ন ফাইল খোলার দরকার পড়ার মতো নয়।

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

প্রশ্নটি

ভাল, ডিআরওয়াই এনজিনেক্স কনফিগারেশন লেখার জন্য কি কোনও "অফিসিয়াল" সেরা অনুশীলন রয়েছে?

আমি যেমন একটি প্যাটার্ন সন্ধান করতে চাই:

location / {
    common confs
    try_files $uri @name_location
}

** তবে আমি কীভাবে বিভিন্ন অবস্থানের জন্য নির্দিষ্ট মামলা লিখব? **

আমি কি সাধারণভাবে কনফিডের অস্বাভাবিক অংশ এবং @ নাম_লোকেশনের সাধারণ জায়গা সহ বেশ কয়েকটি অবস্থান যুক্ত করতে পারি?

location /1/ {
    some cache expire settings;
    NOTHING ELSE;
}

location /2/ {
    some other cache expire settings;
    NOTHING ELSE;
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

আমার যখন একই সংস্থানটিতে বিভিন্ন ইউআরএল নির্দেশ করে তখন আমি কী আবার একটি নতুন করে লিখতে পারি?

location /1/ {
    rewrite  ^  /3/  last;
}

location /2/ {
    rewrite ^   /4/  last; 
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

বা সেগুলি কি সমস্তকে এক জায়গায় ভাগ করা উচিত?

location / {
    rewrite ^/1/$  /3/  last;
    rewrite ^/2/$   /4/  last; 

    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

সম্পর্কিত

আমি মেলিং তালিকায় খুব বেশি খুঁজে পাইনি, উইকিতেও এর চেয়ে কম।

দয়া করে মনে রাখবেন এটি এনজিঙ্ক্স সেরা অভ্যাস হিসাবে প্রশ্নটির মতো / না / একই - এটি একটি খুব সাধারণ প্রশ্ন।

এই অন্যটি আরও প্রাসঙ্গিক: আমি কীভাবে এই এনজিএনএক্স কনফিগারেশনটি শুকিয়ে যাব?

উত্তর:


6

আমি nginx মানচিত্র বৈশিষ্ট্যটি ব্যবহার করে অনুরূপ সমস্যা সমাধান করেছি।

প্রথমে ব্যাকএন্ড মানচিত্রে একটি ডোমেন নাম তৈরি করুন:

map $http_host $backend {
  myhost1.tld 192.168.1.100;
  myhost2.tld 192.168.1.101;
  default     upstream_pool1;
}

তারপরে লোকেশনটি মানচিত্রে ব্যবহার করুন

location / {
  common settings
  proxy_pass $backend; 
}

আপনি $ http_host এর পরিবর্তে অন্য কোনও চলক ব্যবহার করতে পারেন এই ম্যানুয়ালটি দেখুন: http://nginx.org/en/docs/http/ngx_http_map_module.html


আমি সম্পর্কে জানতাম না map- বা কমপক্ষে আমি কখনই লক্ষ্য করিনি এবং ভেবেছিলাম যে আমি এটি এর মতো ব্যবহার করতে পারি ... আমাকে এই সম্পর্কে আরও কিছুটা চিন্তা করতে দিন এবং দেখুন আমার আরও প্রশ্ন / মন্তব্য আছে কিনা!
স্টেফানো

2

কোনও নামকৃত স্থানকে সরাসরি "কল" করার কোনও উপায় আছে ?!

কমপক্ষে আরও একটি উপায় রয়েছে:

location /somelocation {
    error_page 418 = @named_location;
    return 418;
}

পাওয়া গেছে এই হ্যাকটি ভিনগ্রহ করে যেমন "প্রক্সি_ড্রেডটাইমআউট" "/ সামলোকেশন" এর ভিতরে সেট করা যখন এনগিনেক্স "রিটার্ন" -কে "@ নাম_লোকেশন" এ যান।
ডেনিস রিজকভ

1
418 আমি কি সত্যিই একটি চাঁচা ?
ওয়াল্ফ 3:40 '

0

কিছু সার্ভার "সার্ভার" এবং "অবস্থান" উভয় প্রসঙ্গেই প্রয়োগ করা যেতে পারে, এটি DRY করে:

# The variables below are evaluated on each request,
# allowing to DRY configs of locations.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;

location /special {
    proxy_send_timeout 10m;
    proxy_read_timeout 10m;
    proxy_pass http://pool;
}

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