try_files large_client_header_buffers index files conf client_max_body_size nginx

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 de alias , 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.