Nginx-statyczny plik obsługujący błąd z root & alias

Muszę obsługiwać moją aplikację przez serwer aplikacji na 8080, a moje pliki statyczne z katalogu bez dotykania serwera aplikacji. Nginx Config mam jest coś takiego...

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

Teraz, z tym config, wszystko działa dobrze. Zauważ, że dyrektywa root jest komentowana.

Jeśli aktywuję root i dezaktywuję alias -- przestaje działać. Jednakże, kiedy usuwam końcowe /static/ z root, zaczyna działać ponownie.

Can niech ktoś wyjaśni, o co chodzi. Proszę również jasno i zwięźle wyjaśnić, jakie są różnice między root i alias oraz ich cele.

 532
Author: treecoder, 2012-05-17

7 answers

Znalazłem odpowiedzi na moje zamieszanie.

Istnieje bardzo istotna różnica między root a alias dyrektywami. Ta różnica istnieje w sposobie przetwarzania ścieżki określonej w root lub alias.

W przypadku dyrektywy root, pełna ścieżka jest dołączana do katalogu głównego wraz z częścią lokalizacji, podczas gdy w przypadku dyrektywy alias, dołączana jest tylko część ścieżki , z wyłączeniem części lokalizacji do pseudonimu .

Do zilustrowania:

Powiedzmy, że mamy config

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}
W tym przypadku ostateczna ścieżka, którą wyprowadzi Nginx, będzie]}
/var/www/app/static/static

To powróci 404 ponieważ nie ma static/ W static/

Dzieje się tak dlatego, że część lokalizacji jest dołączana do ścieżki określonej w root. Stąd, z root, prawidłową drogą jest

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

Z drugiej strony, z alias, część lokalizacji zostaje upuszczona . Więc dla config

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

Ostateczna ścieżka zostanie poprawnie utworzona jako

/var/www/app/static

przypadek ukośnika końcowego dla alias dyrektywy

Nie ma żadnych ostatecznych wytycznych dotyczących tego, czy końcowy Ukośnik jest obowiązkowy dla dokumentacji Nginx, ale powszechna obserwacja ludzi tutaj i gdzie indziej zdaje się wskazywać, że tak jest.

Kilka innych miejsc dyskutowało o tym, nie rozstrzygająco chociaż.

Https://serverfault.com/questions/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

Https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working

 1184
Author: treecoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-20 09:00:55

As say as @ treecoder

W przypadku dyrektywy root pełna ścieżka jest dołączana do katalogu głównego wraz z częścią lokalizacji, podczas gdy w przypadku dyrektywy alias do aliasu jest dołączana tylko część ścieżki nie zawierająca części lokalizacji.

Obraz jest wart tysiąca słów

Dla root:

Tutaj wpisz opis obrazka

Dla alias:

Tutaj wpisz opis obrazka

 115
Author: liuzhijun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 17:41:37

W Twoim przypadku możesz użyć dyrektywy root, ponieważ $uri część dyrektywy location jest taka sama z ostatnią częścią dyrektywy root.

Nginx jest jednym z najbardziej rozpoznawalnych producentów na świecie.]} Gdy lokalizacja odpowiada ostatniej części wartości dyrektywy:

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

Lepiej zamiast tego użyć dyrektywy root:

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

I root dyrektywa dołączą $uri do ścieżki.

 40
Author: antonbormotov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 09:51:53

Tylko szybki dodatek do bardzo pomocnej odpowiedzi @good_computer, chciałem zastąpić katalogiem głównym adresu URL, ale tylko wtedy, gdy pasował do podfolderu zawierającego pliki statyczne(które chciałem zachować jako część ścieżki).

Na przykład, jeśli żądany plik znajduje się w /app/js lub /app/css, Poszukaj w /app/location/public/[that folder].

Mam to do pracy przy użyciu regex.

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }
 22
Author: meloncholy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-05 16:38:31

alias jest używany do zastąpienia ścieżki części lokalizacji (LPP) w ścieżce żądania, podczas gdy root jest używany do poprzedzania ścieżki żądania.

Są to dwa sposoby mapowania ścieżki żądania do ostatecznej ścieżki pliku.

alias może być używany tylko w bloku lokalizacji i nadpisuje zewnętrzny root.

alias i root nie mogą być używane razem w bloku lokalizacji.

 8
Author: Yao Zhao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-25 09:47:52
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/;
    }
}
Blok serwera do obsługi statycznej strony na nginx.
 3
Author: Tapish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 08:15:29

Innymi słowy: w przypadku root podany argument location jest częścią ścieżki i URI. Z drugiej strony-dla alias dyrektywy argument instrukcji location jest częścią URI tylko

Tak więc, {[1] } jest inną nazwą, która mapuje określone URI do określonej ścieżki w systemie plików, podczas gdy root dodaje argument location do ścieżki głównej podanej jako argument do dyrektywy root.

 2
Author: Twissell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-11 17:22:13