Come scrivere un Nginx conf DRY, modulare (proxy inverso) con posizioni nominate


25

Sto usando nginx principalmente come proxy di cache inversa di fronte a diverse applicazioni gunicon / mod_wsgi e, naturalmente, per server file statici.

Trovo che rapidamente le mie conf di Nginx diventano impossibili da mantenere; il problema è che ho alcuni schemi simili (o addirittura identici) ma non riesco a renderlo pulito.

Uno dei maggiori problemi che ho è che mi piacerebbe usare posizioni nominate come un modo per raggruppare una serie di conf, ad es.

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. Il problema non è avere sia gunicorn che wsgi. Questo è solo un esempio. Un altro è:

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
}

ma per chiamare una posizione denominata l'unico modo che ho trovato è:

location /somelocation {
    try_files $uri @named_location;
}

Questo già non sembra giusto, non voglio che nginx vada a cercare file statici, voglio che vada direttamente nella posizione indicata! C'è un modo per "chiamare" direttamente una posizione denominata ?!

Un altro modo in cui pensavo di poter andare a secco è un sacco di include...

location /somelocation {
    include django_unicorn.conf;
}

Ma è un buon modo per farlo? Sembra ok per impostazioni molto generiche (ad es. Quelle proxy), ma non è molto leggibile dover aprire diversi file per ottenere la configurazione completa.

Inoltre, in alcuni casi posso raggruppare alcune posizioni con una regexp, ma mi piace farlo SOLO quando sono logicamente correlate non solo per poter mettere impostazioni comuni nello stesso blocco.

La domanda

Esiste una best practice "ufficiale" per scrivere configurazioni nginx DRY valide?

Mi piacerebbe trovare uno schema come:

location / {
    common confs
    try_files $uri @name_location
}

** ma come posso scrivere casi specifici per località diverse? **

Potrei semplicemente aggiungere diverse posizioni con la parte non comune di conf e quella comune nella posizione @named_?

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
}

Quando ho un URL diverso che punta alla stessa risorsa posso semplicemente fare una riscrittura?

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
}

o dovrebbero essere tutti raggruppati in un'unica posizione?

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
}

Relazionato

Non ho trovato molto nella mailing list, tanto meno nel wiki.

Si noti che questa è / non / uguale alla domanda Best practice di NGinx : è una domanda molto generica.

Quest'altro è più rilevante: come faccio a ASCIUGARE questa configurazione di Nginx?

Risposte:


6

Ho risolto un problema simile usando la funzione nginx map.

Innanzitutto crea un nome di dominio per la mappa di backend:

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

quindi utilizza la mappa in posizione

location / {
  common settings
  proxy_pass $backend; 
}

Puoi usare qualsiasi altra variabile invece di $ http_host Vedi questo manuale: http://nginx.org/en/docs/http/ngx_http_map_module.html


Non lo sapevo map- o almeno non l'avevo mai notato e pensavo di poterlo usare in questo modo ... fammi riflettere un po 'di più su questo e vedere se ho ulteriori domande / commenti!
Stefano,

2

C'è un modo per "chiamare" direttamente una posizione denominata ?!

C'è almeno un altro modo:

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

Trovato questo hack fa dimenticare nginx, ad esempio "proxy_read_timeout" impostato all'interno di "/ somelocation" quando nginx "restituisce" -s a "@named_location".
Denis Ryzhkov,

1
418 Sono una teiera Davvero?
Walf

0

Alcune direttive possono essere applicate sia per contesti "server" che "location", rendendolo SECCO:

# 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.