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.
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
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 directivealias
, seule la partie du chemin SANS la partie emplacement est ajoutée à la alias.
Une image vaut mieux que mille mots
pour root
:
pour alias
:
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.
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;
}
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.
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
.
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.