Nginx - file statico che serve confusione con root e alias


473

Devo servire la mia app tramite il mio server delle applicazioni all'indirizzo 8080e i miei file statici da una directory senza toccare il server delle app. La configurazione di nginx che ho è qualcosa del genere ...

    # 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 bene. Si noti che ilroot direttiva è commentata.

Se attivo roote disattivo il alias- smette di funzionare. Tuttavia, quando rimuovo il finale /static/dalroot esso ricomincia a funzionare.

Qualcuno può spiegare cosa sta succedendo. Spiega inoltre in modo chiaro e dettagliato quali sono le differenze tra roote aliase i loro scopi.

Risposte:


1074

Ho trovato le risposte alle mie confusioni.

Esiste una differenza molto importante tra rootle aliasdirettive e. Questa differenza esiste nel modo in cui il percorso specificato inrootalias viene elaborato o il .

Nel caso della rootdirettiva, il percorso completo viene aggiunto alla radice, inclusa la parte della posizione , mentre nel caso della aliasdirettiva, solo la parte del percorso NON include la parte della posizione viene aggiunta all'alias .

Illustrare:

Diciamo che abbiamo la configurazione

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

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

/var/www/app/static/static

Questo tornerà 404poiché non c'èstatic/ dentrostatic/

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

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

D'altra parte, con alias, la parte della posizione viene eliminata . Quindi per la configurazione

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

il percorso finale verrà formato correttamente come

/var/www/app/static

Il caso della barra finale alias direttiva

Non esiste una linea guida definitiva sul fatto che una barra finale sia obbligatoria per la documentazione di Nginx , ma un'osservazione comune da parte delle persone qui e altrove sembra indicare che lo sia.

Alcuni altri posti hanno discusso di questo, non in modo conclusivo però.

/server/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

/server/375602/why-is-my-nginx-alias-not-working


97
La barra finale sul percorso alias è essenziale!
mafrosi il

2
Tutto questo è ottimo (mi ha aiutato a risolvere i miei problemi di configurazione), ma mi chiedo quali impostazioni di registrazione le persone potrebbero usare per aiutare a diagnosticare questo tipo di problemi? Ad esempio, qualsiasi cosa che stampi sui registri come "richiesta ricevuta per [...], abbinata al blocco di configurazione" location [...] ", ricerca nella directory [...]"
Pistos,

2
@Pistos: messo log_format scripts '$document_root | $uri | > $request';nella httpsezione e access_log /var/log/nginx/scripts.log scripts;nella serversezione della configurazione nginx ..
helvete

Grazie! In effetti la barra finale è essenziale sull'alias, altrimenti ho ottenuto nginx: [emerg] invalid number of arguments in "alias" directive, e il server si è arrestato durante il suo riavvio.
FotisK,

@mafrosis Perché è essenziale?
Bruce Sun,

104

come dire @treecoder

In caso di root direttiva, il percorso completo viene aggiunto alla radice, inclusa la parte della posizione, mentre nel caso della aliasdirettiva, solo la parte del percorso NON inclusa la parte della posizione viene aggiunta all'alias.

Un'immagine vale più di mille parole

per root:

inserisci qui la descrizione dell'immagine

per alias:

inserisci qui la descrizione dell'immagine


11
La prima freccia nella seconda immagine dovrebbe essere un "+"?
aioobe,

35

Nel tuo caso, puoi usare la rootdirettiva, perché $uriparte della locationdirettiva è la stessa con l'ultima rootparte della direttiva.

Anche la documentazione di Nginx la consiglia:
quando l'ubicazione corrisponde all'ultima parte del valore della direttiva:

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

è preferibile utilizzare invece la direttiva root:

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

e la rootdirettiva verrà aggiunta $urial percorso.


2
Perché è meglio? Nemmeno i documenti lo dicono.
HostedMetrics.com il

Il vantaggio che vedo è di evitare la duplicazione di $ uri, / immagini in un dato esempio, quando si usa l'alias
antonbormotov,

21

Solo un rapido addendum alla risposta molto utile di @ good_computer, volevo sostituire la radice dell'URL con una cartella, ma solo se corrispondeva a una sottocartella contenente file statici (che volevo conservare come parte del percorso).

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

Ho ottenuto questo per funzionare usando un regex.

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

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

1
@Mina È meglio usare root se puoi. (C'è un commento nella documentazione wiki.nginx.org/HttpCoreModule#alias )
Matthew Wilcoxson,

Questo è esattamente ciò per cui sono venuto qui alien
alienfromouterspace

6

alias viene utilizzato per sostituire il percorso della parte della posizione (LPP) nel percorso della richiesta, mentre il root viene utilizzato per essere anteposto al percorso della richiesta.

Esistono due modi per mappare il percorso della richiesta al percorso del file finale.

aliaspuò essere utilizzato solo nel blocco posizione e sovrascriverà l'esterno root.

aliase rootnon possono essere utilizzati insieme nel blocco posizione.


3
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.


2

In altre parole, mantenere questo breve: in caso di root, l'argomento location specificato fa parte del percorso e dell'URI del filesystem . D'altra parte - per l' aliasargomento direttiva dell'istruzione location fa parte solo dell'URI

Quindi, aliasè un nome diverso che associa un determinato URI a un determinato percorso nel filesystem, mentre rootaggiunge l'argomento location al percorso root dato come argomento alla rootdirettiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.