Nginx: expresiones regulares de ubicación para múltiples rutas

30

Tengo dos ubicaciones en la configuración de nginx que funcionan:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

¿Cómo puedo combinar estos dos en una sola ubicación?

Lo que ya he hecho:

Probé esta sugerencia

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

Pero no me funciona.

Además, cuando no uso backends, la siguiente configuración funciona correctamente:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

actualización (algunas cadenas del registro)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

SOLUCIÓN

En realidad, mi solución funciona bien:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

y el problema no tiene nada que ver con los backends. Como Guido Vaccarella notó correctamente, solo siguió a otro location ~ ...que coincidía, por lo que location ~ ...no tuve oportunidad de correr.

Vlad T.
fuente
No veo por qué su pase de proxy regex no funciona. ¿Qué pasa cuando lo intentas?
Gruñón
Cuando lo intento, el frontend nginx arroja un error 404.
Vlad
¿El) al final de la declaración de ubicación es solo un error en su pregunta o también está en su archivo de configuración?
Guido Vaccarella
Debe verificar el resto de su configuración en busca de errores. Además, es posible que desee investigar por qué arroja un 404 al ver dónde está mirando, lo que faltaba. También es posible que arroje 404 en el documento de error que no se encuentra y, por lo tanto, debe mirar un error anterior arrojado.
Gruñón
proporcione el error del registro de errores
Mohammad AbuShady

Respuestas:

30

De acuerdo con la documentación de nginx :

Luego se verifican las expresiones regulares, en el orden de su aparición en el archivo de configuración. La búsqueda de expresiones regulares termina en la primera coincidencia y se utiliza la configuración correspondiente.

En su configuración, la siguiente ubicación se define antes de la que tiene proxy_pass y coincide con la solicitud de archivos js y css en estática :

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

Lamentablemente, la cláusula "log_not_found off" desactiva el registro de cualquier error de archivo no encontrado relacionado con esta ubicación, ¡por eso su error_log está vacío!

Puede intentar comentar esta ubicación o moverla después de la ubicación con el proxy_pass (si lo necesita para otros archivos que no estén en modo estático / multimedia ).

Guido Vaccarella
fuente
13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Debiera ser...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

El cierre debe ser una llave {}, no un paréntesis ().

No puedo creer cuánto tiempo llevó ver eso. Guido tenía razón en los comentarios.

Gruñón
fuente
Oh, perdón por el malentendido, pensé que se refería al soporte después de que "medios" |media)en la cadena comenzó con la "ubicación". Pero la llave incorrecta aquí es solo un error tipográfico (corregido en cuestión). De lo contrario, esta configuración nginx no se cargaría y arrojaría un error similar a unexpected ")"...Lo siento, nuevamente.
Vlad T.