large_client_header_buffers - Nginx-archivo estático que sirve confusión con la raíz y el alias
nginx static server (5)
En su caso, puede usar root
directiva root
, porque la parte $uri
de la directiva de location
es la misma que la última parte de la directiva root
.
La documentación de Nginx lo aconseja también:
Cuando la ubicación coincide con la última parte del valor de la directiva:
location /images/ { alias /data/w3/images/; }
es mejor usar la directiva raíz en su lugar:
location /images/ { root /data/w3; }
y root
directiva root
agregará $uri
a la ruta.
Necesito servir mi aplicación a través de mi servidor de aplicaciones en 8080
, y mis archivos estáticos de un directorio sin tocar el servidor de aplicaciones. La configuración de nginx que tengo es algo como esto ...
# 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;
}
}
Ahora, con esta configuración, todo funciona bien. Tenga en cuenta que la directiva root
está comentada.
Si activo la root
y desactivo el alias
, deja de funcionar. Sin embargo, cuando quito la root
/static/
de la root
, comienza a funcionar de nuevo.
¿Puede alguien explicar lo que está pasando? También explique de manera clara y detallada cuáles son las diferencias entre la root
y el alias
, y sus propósitos.
He encontrado respuestas a mis confusiones.
Hay una diferencia muy importante entre las directivas root
y alias
. Esta diferencia existe en la forma en que se procesa la ruta especificada en la root
o el alias
.
En el caso de la directiva root
, la ruta completa se agrega a la raíz que incluye la parte de ubicación , mientras que en el caso de la directiva de alias
, solo la parte de la ruta que NO incluye la parte de ubicación se agrega a la alias .
Para ilustrar:
Digamos que tenemos la configuración.
location /static/ {
root /var/www/app/static/;
autoindex off;
}
En este caso, la ruta final que Nginx derivará será
/var/www/app/static/static
Esto devolverá 404
ya que no hay static/
dentro de static/
Esto se debe a que la parte de ubicación se agrega a la ruta especificada en la root
. Por lo tanto, con la root
, la forma correcta es
location /static/ {
root /var/www/app/;
autoindex off;
}
Por otro lado, con alias
, la parte de ubicación se cae . Así que para la configuración
location /static/ {
alias /var/www/app/static/;
autoindex off;
}
el camino final se formará correctamente como
/var/www/app/static
Consulte la documentación aquí: http://wiki.nginx.org/HttpCoreModule#alias
Solo una adición rápida a la respuesta muy útil de @ good_computer, quería reemplazar la raíz de la URL con una carpeta, pero solo si coincidía con una subcarpeta que contenía archivos estáticos (que quería conservar como parte de la ruta).
Por ejemplo, si el archivo solicitado está en /app/js
o /app/css
, busque en /app/location/public/[that folder]
.
Conseguí esto para trabajar usando un regex.
location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
alias /home/user/sites/app/public/$1;
access_log off;
expires max;
}
como se dice como @treecoder
En el caso de la directiva
root
, la ruta completa se agrega a la raíz que incluye la parte de ubicación, mientras que en el caso de la directiva dealias
, solo la parte de la ruta que NO incluye la parte de ubicación se agrega a la alias.
Una imagen vale mas que mil palabras
para la root
:
para alias
:
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/;
}
}
Bloque de servidor para vivir la página estática en nginx.