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

22

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 esta sugestão

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

mas não funciona para mim.

Além disso, quando não uso backends, 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 o problema não tem nada a ver com os backends. Como Guido Vaccarella notou corretamente, apenas seguiu outro location ~ ... que combinou, de modo que meu location ~ ... não teve chance de ser executado.

    
por Vlad T. 30.12.2013 / 10:43

2 respostas

27

De acordo com a documentação do nginx :

Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used.

Na sua configuração, a seguinte localização é definida antes da que tem o proxy_pass e corresponde à solicitação dos arquivos js e css em static :

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

Infelizmente, a cláusula "log_not_found off" desabilita o log de qualquer erro de arquivo não encontrado relacionado a este local, e é por isso que seu error_log está vazio!

Você pode tentar comentar este local ou movê-lo após o local com o proxy_pass (se você precisar dele para outros arquivos que não estejam em static / media ).

    
por 04.01.2014 / 23:50
9
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Deve ser ...

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

O fechamento precisa ser uma chave {}, não um parêntese ().

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

    
por 01.01.2014 / 07:00

Tags