web-dev-qa-db-fra.com

Nginx - fichier statique servant la confusion avec root et alias

Je dois servir mon application via mon serveur d'applications à l'adresse 8080 et mes fichiers statiques à partir d'un répertoire sans toucher au serveur d'applications. La configuration de nginx que j'ai est quelque chose comme ça ...

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

Maintenant, avec cette config, tout fonctionne bien. Notez que la directive root est commentée.

Si j'active root et désactive le alias - il ne fonctionne plus. Cependant, lorsque je supprime le /static/ final du root, il recommence à fonctionner.

Quelqu'un peut-il expliquer ce qui se passe. Veuillez également expliquer clairement et verbalement quelles sont les différences entre root et alias et leurs objectifs.

398
treecoder

J'ai trouvé des réponses à mes confusions.

Il existe une différence très importante entre les directives root et alias. Cette différence existe dans la manière dont le chemin spécifié dans root ou alias est traité.

Dans le cas de la directive root, le chemin complet est ajouté à la racine , y compris la partie emplacement , alors que dans le cas de la directive alias, , seule la partie du chemin SANS la partie localisation est ajoutée à l'alias .

Pour illustrer:

Disons que nous avons la config

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

Dans ce cas, le chemin final que Nginx tirera sera

/var/www/app/static/static

Ceci va retourner 404 puisqu'il n'y a pas de static/ dans static/

En effet, la partie emplacement est ajoutée au chemin spécifié dans la variable root. Par conséquent, avec root, la manière correcte est

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

Par contre, avec alias, la partie localisation est supprimée . Donc pour la config

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

le chemin final sera correctement formé comme

/var/www/app/static

Voir la documentation ici: http://wiki.nginx.org/HttpCoreModule#alias

951
treecoder

comme dit comme @treecoder

Dans le cas de la directive root, le chemin complet est ajouté à la racine, y compris la partie emplacement, alors que dans le cas de la directive alias, seule la partie du chemin SANS la partie emplacement est ajoutée à la alias.

Une image vaut mieux que mille mots

pour root:

enter image description here

pour alias:

enter image description here

77
liuzhijun

Dans votre cas, vous pouvez utiliser la directive root, car la partie $uri de la directive location est identique à la dernière partie de la directive root.

documentation Nginx le conseille également:
Lorsque l'emplacement correspond à la dernière partie de la valeur de la directive:

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

il vaut mieux utiliser la directive root à la place:

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

et la directive root ajoutera $uri au chemin.

31
antonbormotov

Juste un ajout rapide à la réponse très utile de @ good_computer, je voulais remplacer à la racine de l'URL par un dossier, mais uniquement si cela correspond à un sous-dossier contenant des fichiers statiques (que je voulais conserver dans le chemin).

Par exemple, si le fichier demandé se trouve dans /app/js ou /app/css, recherchez dans /app/location/public/[that folder].

Je dois travailler avec une regex.

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

Le serveur bloque pour vivre la page statique sur nginx.

3
Tapish

En d'autres termes, en gardant ce brief: dans le cas de root, l'argument d'emplacement spécifié fait partie de chemin du système de fichiers et URI. D'autre part, l'argument de directive alias de la directive location fait partie de adresse URI uniquement

Donc, alias est un nom différent qui mappe un certain URI sur un certain chemin du système de fichiers, alors que root ajoute un argument de localisation au chemin racine donné en tant qu'argument à la directive root.

1
Twissell

alias est utilisé pour remplacer le chemin de la partie emplacement (LPP) dans le chemin de la demande, tandis que root est utilisé pour ajouter un préfixe au chemin de la demande.

Il existe deux manières de mapper le chemin de la demande sur le chemin du fichier final.

alias ne peut être utilisé que dans le bloc d'emplacement. Il remplacera l'extérieur root.

alias et root ne peuvent pas être utilisés ensemble dans un bloc d'emplacement.

0
Yao Zhao