Nginx - статический файловый беспорядок с корневым и псевдонимом

Мне нужно обслуживать мое приложение через мой сервер приложений в 8080 и мои статические файлы из каталога, не касаясь сервера приложений. Конфигурация nginx у меня есть что-то вроде этого...

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

Теперь, с этой конфигурацией, все работает нормально. Обратите внимание, что директива root закомментирована.

Если я активирую root и деактивирую alias - он перестает работать. Однако, когда я удаляю конечный /static/ из root, он снова начинает работать.

Может кто-нибудь объяснить, что происходит. Также объясните, пожалуйста, четко и подробно, какие различия между root и alias и их целями.

Ответ 1

Я нашел ответы на мои заблуждения.

Существует очень важное различие между директивами root и alias. Это различие существует в способе обработки пути, указанного в root или alias.

В случае root директивы к root каталогу добавляется полный путь, включая часть местоположения, тогда как в случае директивы alias к alias добавляется только часть пути, НЕ включающая часть местоположения.

Проиллюстрировать:

Допустим, у нас есть конфиг

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

В этом случае последний путь, который получит Nginx, будет

/var/www/app/static/static

Это вернет 404 так как нет static/ внутри static/

Это связано с тем, что часть местоположения добавляется к пути, указанному в root. Следовательно, с root, правильный путь

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

С другой стороны, с alias, часть местоположения удаляется. Так что за конфиг

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

окончательный путь будет правильно сформирован как

/var/www/app/static

Смотрите документацию здесь: http://wiki.nginx.org/HttpCoreModule#alias

Ответ 2

как говорят @treecoder

В случае директивы root полный путь добавляется к корню, включая часть местоположения, тогда как в случае директивы alias только часть пути, не включающая часть местоположения, добавляется к псевдониму.

Изображение стоит тысячи слов

для root:

введите описание изображения здесь

для alias:

введите описание изображения здесь

Ответ 3

В вашем случае вы можете использовать root директиву, потому что $uri часть директивы location совпадает с последней root директивой.

Документация Nginx также советует:
Когда location соответствует последней части значения директив:

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

вместо этого лучше использовать корневую директиву:

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

и root директива добавит $uri к пути.

Ответ 4

Просто быстрое добавление к @good_computer очень полезного ответа, я хотел заменить на корневой каталог URL-адресом, но только если он соответствует подпапке, содержащей статические файлы (которые я хотел сохранить как часть пути).

Например, если запрашиваемый файл находится в /app/js или /app/css, посмотрите /app/location/public/[that folder].

Я получил это для работы с использованием регулярного выражения.

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

Ответ 5

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

Серверный блок для размещения статической страницы в nginx.

Ответ 6

Другими словами, соблюдая это кратко: в случае root указанный аргумент location является частью пути файловой системы и URI. С другой стороны - для директивы alias аргумент оператора location является частью только URI

Таким образом, alias - это другое имя, которое отображает определенный URI на определенный путь в файловой системе, тогда как root добавляет аргумент location к корневому пути, указанному в качестве аргумента для директивы root.

Ответ 7

alias используется для замены пути части местоположения (LPP) в пути запроса, в то время как root используется для добавления к пути запроса.

Это два способа сопоставить путь запроса с окончательным путем к файлу.

alias может использоваться только в блоке местоположения, и он переопределит внешний root.

alias и root не могут использоваться в блоке вместе.