नामित स्थानों के साथ DRY, मॉड्यूलर नग्‍नेक्‍स कॉन्फिडेंस (रिवर्स प्रॉक्सी) कैसे लिखें


25

मैं ज्यादातर gunicon / mod_wsgi अनुप्रयोगों और निश्चित रूप से सर्वर स्टैटिक फ़ाइलों के सामने nginx का उपयोग रिवर्स कैचिंग प्रॉक्सी के रूप में कर रहा हूँ।

मुझे लगता है कि जल्दी से मेरे नगनेक्स को बनाए रखना असंभव हो जाता है; मुद्दा यह है कि मेरे पास कुछ पैटर्न हैं जो समान (या समरूप) हैं लेकिन मैं इसे साफ करने का प्रबंधन नहीं कर सकता।

मेरे पास सबसे बड़ी समस्याओं में से एक यह है कि मैं नामित स्थानों को एक सेट के रूप में उपयोग करना पसंद करूंगा, जैसे कि सेट्स ऑफ़ सेट्स।

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

यह पहले से ही सही नहीं लगता है, मैं नहीं चाहता कि नाज़िनक्स स्थिर फ़ाइलों की तलाश में जाए, मैं चाहता हूं कि यह सीधे नामित स्थान पर जाए! वहाँ सीधे एक नामित स्थान "कॉल" करने के लिए एक रास्ता है ?!

एक और तरीका मुझे लगा कि मैं सूखे के लिए जा सकता हूं include...

location /somelocation {
    include django_unicorn.conf;
}

लेकिन क्या यह एक अच्छा तरीका है? यह बहुत सामान्य सेटिंग्स के लिए ठीक लगता है (उदाहरण के लिए प्रॉक्सी वाले), लेकिन पूर्ण जानकारी प्राप्त करने के लिए विभिन्न फ़ाइलों को खोलने के लिए जाना बहुत ही पठनीय नहीं है।

इसके अलावा, कुछ मामलों में मैं कुछ स्थानों को एक regexp के साथ समूहीकृत कर सकता हूं, लेकिन मुझे केवल ऐसा करना पसंद है जब वे तार्किक रूप से संबंधित होते हैं न कि एक ही ब्लॉक में सामान्य सेटिंग्स को सक्षम करने के लिए।

प्रश्न

क्या एक "आधिकारिक" सबसे अच्छा अभ्यास लिखने के लिए अच्छा है, DRY nginx विन्यास?

मैं एक पैटर्न ढूंढना पसंद करूंगा:

location / {
    common confs
    try_files $uri @name_location
}

** लेकिन मैं विभिन्न स्थानों के लिए विशिष्ट मामले कैसे लिख सकता हूं? **

क्या मैं बस इस पते के असामान्य भाग के साथ कई स्थानों को जोड़ सकता हूं और जो @ an_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
}

सम्बंधित

मैं मेलिंग सूची में बहुत कम नहीं मिला, यहां तक ​​कि विकी में भी कम।

कृपया ध्यान दें कि यह प्रश्न / NGIx बेस्ट प्रैक्टिस के समान है / नहीं - यह एक बहुत ही सामान्य प्रश्न है।

यह एक और अधिक प्रासंगिक है: मैं इस Nginx कॉन्फ़िगरेशन को कैसे तैयार कर सकता हूं?

जवाबों:


6

मैंने इसी तरह की समस्या को nginx map फीचर का उपयोग करके हल किया है।

पहले बैकएंड मैप के लिए एक डोमेन नाम बनाएं:

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

पाया गया कि यह हैक करने के लिए नगणक्स को भूल जाता है जैसे "प्रॉक्सी_ड्रेड / आउट" के अंदर सेट "/ सोमेलोकेशन" जब nginx "return" -s से "@ name_location"।
डेनिस राउज़कोव

1
418 मैं एक चायदानी हूँ ?
Walf

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.