2012-05-17 17 views
283

Ho bisogno di servire la mia app attraverso il mio server app allo 8080 e i miei file statici da una directory senza toccare il server dell'app. La configurazione di nginx che ho è qualcosa del genere ...Nginx - file statico che serve confusione con root e alias

# 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; 
      } 
    } 

Ora, con questa configurazione, tutto funziona correttamente. Si noti che la direttiva root è commentata.

Se si attiva root e si disattiva il alias - smette di funzionare. Tuttavia, quando rimuovo lo strascico /static/ da root, riprende a funzionare.

Qualcuno può spiegare cosa sta succedendo. Inoltre, spiega chiaramente e in modo dettagliato quali sono le differenze tra root e alias e le loro finalità.

risposta

711

Ho trovato risposte alle mie confusioni.

C'è una differenza molto importante tra le direttive root e alias. Questa differenza esiste nel modo in cui viene elaborato il percorso specificato in root o alias.

Nel caso della direttiva root, percorso completo viene aggiunto alla radice compresa la parte posizione, mentre nel caso della direttiva alias, solo la porzione del percorso NON inclusa la parte posizione è aggiunto all'alias.

Facciamo un esempio:

Diciamo che abbiamo la configurazione

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

In questo caso il percorso finale che Nginx deriverà sarà

/var/www/app/static/static 

Questo sta per tornare 404 dal non c'è static/ entro static/

Questo perché la parte posizione viene aggiunta al percorso specificato nello root. Quindi, con root, il modo corretto è

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

D'altra parte, con alias, la posizione della parte ottiene caduto. Così, per la configurazione

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

sarà correttamente essere formato il percorso finale come

/var/www/app/static 

consultare la documentazione qui: http://wiki.nginx.org/HttpCoreModule#alias

+7

Il vostro dettagliato è stato di grande aiuto! Grazie mille ! –

+27

La barra finale sul percorso dell'alias è essenziale! – mafrosis

+3

OMG, grazie mille che l'ultimo colpo mi è costato mezza giornata. – notalentgeek

14

Solo una breve addendum al @ good_computer risposta è molto utile, ho voluto sostituire alla radice dell'URL con una cartella, ma solo se corrisponde a una sottocartella contenente file statici (che volevo conservare come parte del percorso).

Ad esempio se il file richiesto è in /app/js o /app/css, cercare in /app/location/public/[that folder].

Ho ottenuto che questo funzioni utilizzando un'espressione regolare.

location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ { 
    alias /home/user/sites/app/public/$1; 
    access_log off; 
    expires max; 
} 
+1

Grazie per questa risposta. So che sono passati 3 anni, ma qualcuno potrebbe spiegare se esiste un compromesso tra prestazioni e/o sicurezza tra l'utilizzo di alias e root? – Mina

25

Nel tuo caso, è possibile utilizzare root direttiva, perché $uri parte della direttiva location è lo stesso con ultima root direttiva parte.

Nginx documentation consigli pure:
Quando la posizione corrisponde l'ultima parte del valore della direttiva:

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

è meglio utilizzare la direttiva root invece:

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

e root aggiungerà $uri al percorso.

+0

Perché è meglio? I documenti non dicono neanche. – Heliodor

+0

Il vantaggio che vedo è di evitare la duplicazione di $ uri,/immagini nell'esempio dato, quando si utilizza alias – antonbormotov

42

come dicono come @treecoder

Nel caso della direttiva root, percorso completo viene aggiunto alla radice compresa la parte posizione, mentre nel caso della direttiva alias, solo la porzione del percorso ad esclusione la parte posizione viene aggiunta all'alias.

una foto vale più di mille parole

per root:

enter image description here

per alias:

enter image description here

+2

La prima freccia nella seconda immagine deve essere un "+"? – aioobe

0
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/; 
    } 
} 

Blocco server per vivere la pagina statica su nginx.

Problemi correlati