Nginx – arquivo estático servindo confusão com raiz e alias

Eu preciso servir meu aplicativo através do meu servidor de aplicativos no 8080 e meus arquivos estáticos de um diretório sem tocar no servidor de aplicativos. A configuração do nginx que eu tenho é algo assim …

  # app server on port 8080 # nginx listens on port 8123 server { listen 8123; access_log off; location /static/ { # root /var/www/app/static/; alias /var/www/app/static/; autoindex off; } location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

Agora, com essa configuração, tudo está funcionando bem. Observe que a diretiva root está comentada.

Se eu ativar root e desativar o alias ele pára de funcionar. No entanto, quando eu removo o trailing /static/ da root ele começa a funcionar novamente.

Alguém pode explicar o que está acontecendo? Também explique com clareza e clareza quais são as diferenças entre root e alias e seus propósitos.

Eu encontrei respostas para minhas confusões.

Existe uma diferença muito importante entre as diretivas root e alias . Essa diferença existe na maneira como o caminho especificado na root ou no alias é processado.

No caso da diretiva root , o caminho completo é anexado à raiz, incluindo a parte do local , enquanto no caso da diretiva alias , somente a parte do caminho que NÃO inclui a parte do local é anexada ao alias .

Ilustrar:

Vamos dizer que temos a configuração

  location /static/ { root /var/www/app/static/; autoindex off; } 

Neste caso, o caminho final que o Nginx irá derivar será

 /var/www/app/static/static 

Isso vai retornar 404 já que não há static/ within static/

Isso ocorre porque a parte do local é anexada ao caminho especificado na root . Assim, com a root , a maneira correta é

  location /static/ { root /var/www/app/; autoindex off; } 

Por outro lado, com alias , a parte de localização é eliminada . Então, para a configuração

  location /static/ { alias /var/www/app/static/; autoindex off; } 

o caminho final será corretamente formado como

 /var/www/app/static 

Veja a documentação aqui: http://wiki.nginx.org/HttpCoreModule#alias

como dizer como @treecoder

No caso da diretiva root , o caminho completo é anexado à raiz, incluindo a parte do local, enquanto no caso da diretiva alias , somente a parte do caminho que NÃO inclui a parte do local é anexada ao alias.

Uma imagem vale mais que mil palavras

para root :

insira a descrição da imagem aqui

para alias :

insira a descrição da imagem aqui

No seu caso, você pode usar root diretiva root , porque $uri parte da diretiva location é a mesma com a última parte da diretiva root .

A documentação do Nginx também o aconselha:
Quando a localização corresponde à última parte do valor da diretiva:

 location /images/ { alias /data/w3/images/; } 

é melhor usar a diretiva raiz:

 location /images/ { root /data/w3; } 

e root diretiva root appendá $uri ao caminho.

Apenas um rápido adendo à resposta muito útil do @bom_computer, eu queria replace a raiz da URL por uma pasta, mas apenas se ela correspondesse a uma subpasta contendo arquivos estáticos (que eu queria reter como parte do caminho).

Por exemplo, se o arquivo solicitado estiver em /app/js ou /app/css , procure em /app/location/public/[that folder] .

Eu tenho isso para trabalhar usando um regex.

  location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ { alias /home/user/sites/app/public/$1; access_log off; expires max; } 
 server { server_name xyz.com; root /home/ubuntu/project_folder/; client_max_body_size 10M; access_log /var/log/nginx/project.access.log; error_log /var/log/nginx/project.error.log; location /static { index index.html; } location /media { alias /home/ubuntu/project/media/; } } 

Bloco de servidor para viver a página estática no nginx.