it-swarm.com.de

Nginx - statische Datei, die zu Verwechslungen mit root & alias führt

Ich muss meine App über meinen App-Server unter 8080 und meine statischen Dateien aus einem Verzeichnis bereitstellen, ohne den App-Server zu berühren. Die Nginx-Konfiguration, die ich habe, ist in etwa so ...

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

Mit dieser Konfiguration funktioniert nun alles einwandfrei. Beachten Sie, dass die Direktive root auskommentiert ist.

Wenn ich root aktiviere und alias deaktiviere, funktioniert es nicht mehr. Wenn ich jedoch den nachgestellten /static/ aus dem root entferne, funktioniert er wieder.

Kann jemand erklären, was los ist. Erklären Sie außerdem bitte klar und ausführlich, worin die Unterschiede zwischen root und alias und deren Zweck bestehen.

398
treecoder

Ich habe Antworten auf meine Verwirrungen gefunden.

Es gibt einen sehr wichtigen Unterschied zwischen den Anweisungen root und alias. Dieser Unterschied besteht in der Art und Weise, wie der in root oder alias angegebene Pfad verarbeitet wird.

Im Falle der Anweisung root wird der vollständige Pfad an die Wurzel angehängt, einschließlich des Positionsteils , während bei der Anweisung alias nur der Teil des Pfades ohne den Positionsteil angehängt wird der Alias ​​.

Um zu veranschaulichen:

Nehmen wir an, wir haben die Konfiguration

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

In diesem Fall lautet der endgültige Pfad, den Nginx ableitet

/var/www/app/static/static

Dies wird 404 zurückgeben, da static/ in static/ nicht vorhanden ist.

Dies liegt daran, dass der Positionsteil an den in root angegebenen Pfad angehängt wird. Daher ist mit root der richtige Weg

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

Andererseits wird bei alias der Ortsteil gelöscht . Also für die Konfig

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

der endgültige Pfad wird korrekt als gebildet

/var/www/app/static

Siehe die Dokumentation hier: http://wiki.nginx.org/HttpCoreModule#alias

951
treecoder

wie sagt man als @treecoder

Bei der Anweisung root wird der vollständige Pfad einschließlich des Positionsteils an den Stamm angehängt, während bei der Anweisung alias nur der Teil des Pfads, der NICHT den Positionsteil enthält, an den Pfad angehängt wird alias.

Ein Bild sagt mehr als tausend Worte

für root:

enter image description here

für alias:

enter image description here

77
liuzhijun

In Ihrem Fall können Sie die Direktive root verwenden, da der Teil $uri der Direktive location mit dem letzten Teil der Direktive root identisch ist.

Nginx-Dokumentation empfiehlt es auch:
Wenn der Standort mit dem letzten Teil des Werts der Direktive übereinstimmt:

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

es ist besser, stattdessen die root-Direktive zu verwenden:

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

die Anweisung root hängt $uri an den Pfad an.

31
antonbormotov

Nur ein kurzer Nachtrag zu der sehr hilfreichen Antwort von @ good_computer. Ich wollte das Stammverzeichnis der URL durch einen Ordner ersetzen, allerdings nur, wenn dieser mit einem Unterordner mit statischen Dateien übereinstimmt (den ich als Teil des Pfads beibehalten wollte).

Wenn sich die angeforderte Datei beispielsweise in /app/js oder /app/css befindet, suchen Sie in /app/location/public/[that folder].

Ich habe dies mit einem Regex arbeiten.

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }
20
meloncholy
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/;
    }
}

Server-Block, um die statische Seite auf Nginx zu leben.

3
Tapish

Kurz gesagt: Im Fall von root ist das angegebene Standortargument Teil von Pfad und URI des Dateisystems. Andererseits ist das Argument der Anweisung location für die Anweisung alias Teil von nur URI

Daher ist alias ein anderer Name, der bestimmten URI einem bestimmten Pfad im Dateisystem zuordnet, während root das Argument location an den Root-Pfad anfügt, der als Argument für die Anweisung root angegeben wurde.

1
Twissell

alias wird verwendet, um den LPP (Location Part Path) im Anforderungspfad zu ersetzen, während root dem Anforderungspfad vorangestellt wird.

Sie haben zwei Möglichkeiten, den Anforderungspfad dem endgültigen Dateipfad zuzuordnen.

alias konnte nur im Positionsblock verwendet werden und überschreibt die äußere root.

alias und root können nicht zusammen im Standortblock verwendet werden.

0
Yao Zhao