Nginx - статичний файл, що обслуговує плутанину з root та псевдонімом


473

Мені потрібно обслуговувати свою програму через сервер додатків за адресою 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та їх цілями.

Відповіді:


1074

Я знайшов відповіді на свої плутанини.

Існує дуже важлива різниця між директивами rootта aliasдирективами. Ця різниця існує в тому, як обробляється шлях, зазначений у rootабоalias

У випадку rootдирективи повний шлях додається до кореня, включаючи частину розташування , тоді як у випадку 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;           ↑
}                            |
                             pay attention to this trailing slash

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

/var/www/app/static

Випадок останньої косої риски для aliasдирективи

Не існує остаточного настанови щодо того, чи є косою косою рисою обов'язковою документацією Nginx , але загальне спостереження людей тут і в інших місцях, схоже, свідчить про це.

Ще кілька місць обговорили це, хоча не остаточно.

/server/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

/server/375602/why-is-my-nginx-alias-not-working


97
Косою косою рисою шляху псевдоніму важливо!
мафроз

2
Це все чудово (це допомогло мені виправити проблеми з налаштуваннями), але мені цікаво, які налаштування журналу люди можуть використовувати для діагностики подібних проблем? Мовляв, усе, що надрукується в журналах, як-от "отриманий запит на [...], збігається з" config [...] "блоком конфігурації, пошуковим каталогом [...]"
Пістос

2
@ Pistos: введено log_format scripts '$document_root | $uri | > $request';в httpрозділ і access_log /var/log/nginx/scripts.log scripts;в serverрозділ nginx config ..
helvete

Дякую! Дійсно, косою косою рисою є важливе значення для псевдоніму, інакше я отримав nginx: [emerg] invalid number of arguments in "alias" directive, і сервер під час його перезавантаження зійшов.
FotisK

@mafrosis Чому це важливо?
Брюс Нд

104

як кажуть як @treecoder

У випадку rootдирективи повний шлях додається до кореня, включаючи частину розташування, тоді як у випадку aliasдирективи до псевдоніму додається лише частина шляху, що не включає частину місцеположення.

Малюнок вартує тисячі слів

для root:

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

для alias:

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


11
Чи повинна перша стрілка на другому зображенні бути "+"?
aioobe

35

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

Документація Nginx також радить це:
коли розташування відповідає останній частині значення директиви:

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

краще замість цього використовувати кореневу директиву:

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

і rootдиректива буде додана $uriдо шляху.


2
Чому краще? Документи теж не кажуть.
HostedMetrics.com

Користь, яку я бачу, полягає у тому, щоб уникнути дублювання $ uri, / зображень у наведеному прикладі при використанні псевдоніму
antonbormotov

21

Лише швидке доповнення до дуже корисної відповіді @ 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;
 }

2
Дякую за цю відповідь. Я знаю, що це через 3 роки, але хтось міг би пояснити, чи є ефективність та / або компроміс безпеки між використанням псевдоніму та root?
Міна

1
@Mina Краще використовувати root, якщо зможеш. (Є коментар у документах wiki.nginx.org/HttpCoreModule#alias )
Меттью Вілкокссон

Саме це я прийшов сюди за 👍👏
alienfromouterspace

6

alias використовується для заміни шляху до місця розташування (LPP) у шляху запиту, тоді як root як використовується попередньо для шляху запиту.

Вони є двома способами відображення шляху запиту до остаточного шляху файлу.

aliasможе використовуватися лише в блоці розташування, і він буде перекривати зовнішню root.

aliasі rootїх не можна використовувати в блоці розташування разом.


3
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.


2

Іншими словами про збереження цього стислості: у випадку rootвказаного аргументу розташування є частиною шляху файлової системи та URI . З іншого боку - aliasаргументація директиви заяви про місцезнаходження є частиною URI

Отже, aliasце інше ім'я, яке відображає певний URI на певний шлях у файловій системі, тоді як rootдодає аргумент розташування до кореневого шляху, заданого як аргумент до rootдирективи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.