23 votos

Cómo escribir un seco, modular nginx conf (proxy inverso) con el nombre ubicaciones

Estoy usando el nginx principalmente como un inversa cachining proxy delante de varios gunicon/mod_wsgi aplicaciones y, por supuesto, para servidor de archivos estáticos.

Me parece que rápidamente mi nginx confs llegar a ser imposible mantener; la cuestión es que tengo un par de patrones que son similares (o incluso idénticos), pero no he podido hacer la limpieza.

Uno de los mayores problemas que tengo es que me encantaría usar lugares el nombre como una forma de agrupar un conjunto de confs, por ejemplo.

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. El problema es no tener tanto gunicorn y wsgi. Eso es sólo un ejemplo. Otra es:

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
}

pero para llamar a un nombre de ubicación de la única manera que he encontrado es :

location /somelocation {
    try_files $uri @named_location;
}

Esto ya no se siente a la derecha, yo no quiero nginx para ir a buscar los archivos estáticos, yo quiero que vaya directamente a la ubicación con nombre! Es allí una manera de "llamar" a un nombre de ubicación directamente?!

De otra manera, pensé que podría ir en seco es un montón de include...

location /somelocation {
    include django_unicorn.conf;
}

Pero es esta una buena manera de hacerlo? Suena muy bien para las opciones genéricas (por ejemplo. proxy), pero no es muy legible a tener que ir a abrir diferentes archivos para obtener la totalidad de la conf.

También, en algunos casos me pueden agrupar en algunas localidades con una regexp, pero me gusta hacerlo SÓLO cuando están relacionados lógicamente, no sólo para ser capaz de poner en común los ajustes en el mismo bloque.

La Pregunta

Hay un "oficial" de las mejores prácticas para escribir un buen, servicio de nginx configuraciones?

Me gustaría encontrar un patrón como:

location / {
    common confs
    try_files $uri @name_location
}

** pero, ¿cómo puedo escribir casos específicos para diferentes ubicaciones? **

Podría simplemente añadir varias ubicaciones con la infrecuente parte de la conf y la común en la @named_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
}

Cuando he diferentes url que apunta a un mismo recurso puede simplemente hacer una reescritura?

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 deberían estar todos agrupados en un solo lugar?

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
}

Relacionados con la

No pude encontrar mucho en la lista de correo, y mucho menos en la wiki.

Tenga en cuenta que es /no/ de la misma forma que en la pregunta NGinx Mejores Prácticas - esa es una pregunta genérica.

Este otro es más relevante: ¿Cómo puedo SECAR esta la configuración de Nginx?

3voto

DukeLion Puntos2341

He resuelto problema similar uso nginx mapa característica.

Primero crea un nombre de dominio al mapa de back-end:

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

Entonces usa nuestro mapa de ubicación

location / {
  common settings
  proxy_pass $backend; 
}

Puede utilizar cualquier otra variable en lugar de $http_host ver este manual: http://nginx.org/en/docs/http/ngx_http_map_module.html

2voto

blwy10 Puntos2858

¿Hay una forma de "pedir" un lugar llamado directamente?

Hay una forma más por lo menos:

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

0voto

Denis Ryzhkov Puntos101

Algunas directivas pueden ser aplicados para contextos tanto "servidor" y la "ubicación", convirtiéndolo en seco:

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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: