Nginx: regex de localização para vários caminhos

30

Eu tenho dois locais na configuração do nginx que funcionam:

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

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

Como posso combinar esses dois em um único local?

O que eu já fiz:

Eu tentei essa sugestão

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

mas isso não funciona para mim.

Além disso, quando não uso back-end, a seguinte configuração está funcionando corretamente:

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

update (algumas strings do log)

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$

SOLUÇÃO

Na verdade, minha solução funciona bem:

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

e a questão não tem nada a ver com os back-ends. Como Guido Vaccarella percebeu corretamente, apenas seguiu um após o outro, o location ~ ...que fez com que eu location ~ ...não tivesse chance de correr.

Vlad T.
fonte
Não vejo por que seu passe de proxy regex não funciona. O que acontece quando você tenta?
Rabugento
Quando eu tento, o frontend nginx lança erro 404.
Vlad T.
A declaração no final da localização é apenas um erro na sua pergunta ou também está no seu arquivo de configuração?
Guido Vaccarella
Você deve verificar o restante da sua configuração quanto a erros. Além disso, talvez você queira investigar por que está lançando um 404 vendo para onde está olhando, o que estava faltando. Também é possível que ele lance 404 no documento de erro que não foi encontrado e, portanto, precise examinar um erro anterior lançado.
Grumpy
forneça o erro no log de erros
Mohammad AbuShady

Respostas:

30

De acordo com a documentação do nginx :

Em seguida, as expressões regulares são verificadas, na ordem em que aparecem no arquivo de configuração. A pesquisa de expressões regulares termina na primeira correspondência e a configuração correspondente é usada.

Na sua configuração, o seguinte local é definido antes do local com proxy_pass e corresponde à solicitação dos arquivos js e css sob estático :

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

Infelizmente, a cláusula "log_not_found off" desativa o registro de qualquer erro de arquivo não encontrado relacionado a esse local, por isso o seu error_log está vazio!

Você pode tentar comentar esse local ou movê-lo após o local com o proxy_pass (se precisar dele para outros arquivos que não estejam em estática / mídia ).

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

Deveria estar...

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

O fechamento precisa ser um colchete {}, não um colchete entre parênteses ().

Não posso acreditar quanto tempo levou para ver isso. Guido estava certo nos comentários.

Mal humorado
fonte
Ah, desculpe pelo mal-entendido, eu pensei que isso significava o suporte depois que "media" |media)na string começou com o "location". Mas a chave errada aqui é apenas um erro de digitação (corrigido em questão). Caso contrário, essa configuração do nginx não seria carregada e geraria um erro como unexpected ")"...Desculpe, novamente.
Vlad T.