Adlandırılmış konumlarla DRY, modüler nginx conf (ters proxy) nasıl yazılır


25

Nginx'i çoğunlukla birkaç gunicon / mod_wsgi uygulamasının ve tabii ki sunucu statik dosyalarının önünde ters önbellekleme proxy'si olarak kullanıyorum.

Hızlı bir şekilde nginx onaylarımın korunmasının imkansız hale geldiğini; Mesele şu ki, benzer (hatta aynı) bir kaç paternim var ama onu temizlemeyi başaramıyorum.

Sahip olduğum en büyük sorunlardan biri, adlandırılmış konumları bir grup gizliliği gruplandırmanın bir yolu olarak kullanmayı çok isterdim, örneğin.

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

NB. Mesele hem gunicorn'a hem de wsgi'ye sahip değil . Bu sadece bir örnek. Bir diğeri:

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
}

Ancak, adlandırılmış bir konumu aramak için buldum tek yolu:

location /somelocation {
    try_files $uri @named_location;
}

Bu zaten doğru gelmiyor, ben do not , ben adlandırılmış bir yerine gitmek isteyen statik dosyalar için göz gitmek nginx istiyorum! Doğrudan adlandırılmış bir yere "çağrı" için bir yolu var mı?

Kuruya gidebileceğimi düşündüğüm bir başka yol da include...

location /somelocation {
    include django_unicorn.conf;
}

Ama bu yapmak için iyi bir yol mu? Çok genel ayarlar (örneğin, proxy ayarları) için uygun görünmüyor, ancak tüm ayarları elde etmek için farklı dosyalar açmak zorunda kalmak çok okunaklı değil.

Ayrıca, bazı durumlarda bir regexp ile birkaç konumu gruplandırabilirim, ancak SADECE sadece aynı ayarları genel ayarları yapabilmek için değil, mantıksal olarak ilgili oldukları zaman da yapmayı seviyorum.

Soru

İyi, DRY nginx yapılandırmaları yazmak için "resmi" bir en iyi uygulama var mı?

Gibi bir kalıp bulmak isterdim:

location / {
    common confs
    try_files $uri @name_location
}

** ama farklı yerler için nasıl özel durumlar yazarım? **

Sadece conf'ın nadir olmayan kısmı ve @ named_location içindeki ortak konum ile birkaç konum ekleyebilir miyim?

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
}

Aynı kaynağa işaret eden farklı bir URL'm olduğunda, tekrar yazabilir miyim?

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
}

Yoksa hepsi tek bir yerde mi gruplandırılmalı?

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
}

İlgili

E-posta listesinde pek bir şey bulamadım, hatta wikide daha az.

Lütfen bunun NGinx Best Practices sorusu ile aynı olup olmadığını unutmayın - bu çok genel bir soru.

Diğeri daha alakalı: Bu Nginx yapılandırmasını nasıl KURUTABİLİRİM?

Yanıtlar:


6

Nginx harita özelliğini kullanarak benzer bir sorunu çözdüm.

Öncelikle haritayı arka uçlamak için bir alan adı oluşturun:

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

sonra haritayı konumunda kullanın

location / {
  common settings
  proxy_pass $backend; 
}

$ Http_host yerine başka bir değişken kullanabilirsiniz Bu kılavuza bakın: http://nginx.org/en/docs/http/ngx_http_map_module.html


Bilmiyordum map- ya da en azından hiç farketmemiştim ve bu şekilde kullanabileceğimi düşündüm ... bu konuda biraz daha düşüneyim ve ek sorular / yorumlarınız olup olmadığını görün!
Stefano

2

Doğrudan adlandırılmış bir yere "çağrı" için bir yolu var mı?

En azından bir yol daha var:

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

Bu hack’in, nginx "-s" @named_location "döndürdüğünde" proxy_read_timeout "un" / somelocation "ı (örn." Set ") unutmasını sağlar.
Denis Ryzhkov

1
418 Ben gerçekten bir çaydanlık mısın?
Walf

0

Bazı yönergeler hem "sunucu" hem de "konum" bağlamları için uygulanabilir;

# 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.