Configure nginx con múltiples ubicaciones con diferentes carpetas raíz en el subdominio

202

Estoy buscando servir la URL raíz de un subdominio y el directorio de un subdominio a dos carpetas diferentes en mi servidor. Aquí está la configuración simple que tengo y no funciona ...

server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
            root /web/test.example.com/www;
    }

    location /static {
            root /web/test.example.com/static;
    }
}

En este ejemplo, va a test.example.com/traer el archivo de índice en/web/test.example.com/www

e iba a test.example.com/statictraer el archivo de índice en/web/test.example.com/static

simoes
fuente

Respuestas:

238

Necesita usar la aliasdirectiva para location /static:

server {

  index index.html;
  server_name test.example.com;

  root /web/test.example.com/www;

  location /static/ {
    alias /web/test.example.com/static/;
  }

}

El wiki de nginx explica la diferencia entre root y alias mejor que yo:

Tenga en cuenta que puede parecer similar a la directiva raíz a primera vista, pero la raíz del documento no cambia, solo la ruta del sistema de archivos utilizada para la solicitud. La parte de ubicación de la solicitud se elimina en los problemas de Nginx de la solicitud.

Tenga en cuenta que rooty aliasmaneje las barras diagonales diferentes.

furq
fuente
67
El no necesita alias. Por favor, lea los documentos oficiales , no el wiki de la comunidad llenado por los usuarios. Cita: cuando la ubicación coincide con la última parte del valor de la directiva, es mejor usar la directiva raíz .
VBart
9
Esto funcionó para mí, excepto que le falta un corte final. El alias debe leer: alias /web/test.example.com/static/;
ajma
8
@VBart, los documentos dicen exactamente lo que usted dice, pero no justifican esa instrucción en absoluto: parece una elección de estilo arbitraria. ¿Ves alguna razón lógica detrás de esto?
Mark Amery
104

El sistema de directivas de ubicación es

Como si quisiera reenviar todas las solicitudes que comienzan /staticy sus datos presentes en/var/www/static

Entonces, un método simple es separar la última carpeta de la ruta completa, eso significa

Ruta completa : /var/www/static

Último camino: /static y primer camino:/var/www

location <lastPath> {
    root <FirstPath>;
}

Entonces, veamos qué cometió un error y cuáles son sus soluciones

Tu error :

location /static {
    root /web/test.example.com/static;
}

Sus soluciones:

location /static {
    root /web/test.example.com;
}
Kernelv5
fuente
2
Eso me ayudó: me di cuenta de que necesitaba cambiar el nombre de mi carpeta o configurar un enlace simbólico para que todo funcionara.
cjm
3
muchas gracias, estaba fallando exactamente de esta manera :)
bobmoff
10
Esto parece una limitación bastante GRAVE sobre la libertad de hacer lo que quiero. Quiero que los URI que comienzan con una determinada ruta se sirvan desde un directorio que no contiene esa ruta de URI en su ruta de archivo físico. Con esta solución, me FORZO a colocar mis documentos en el disco bajo una ruta que termina con "/ static". Esto no me gusta en absoluto. Quiero libertad absoluta y completa de poner los archivos donde quiera.
Szczepan Hołyszewski
48
server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
        root /web/test.example.com/www;
    }

    location /static {
        root /web/test.example.com;
    }
}

http://nginx.org/r/root

VBart
fuente
2
¿Cuál es la diferencia con pedido?
TangMonk
55
@ Wood la diferencia: en root /web/test.example.com;lugar de root /web/test.example.com/static;. nginx asigna la ruta especificada por ubicación al árbol de dirección y dado que la ruta y el directorio de origen comparten el mismo nombre, funciona root.
rmoestl