Nginx — 루트 및 별명과 혼동되는 정적 파일


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다시 작동하기 시작합니다.

누군가 무슨 일인지 설명 할 수 있습니까? 또한 사이의 차이점이 무엇인지 명확하고 자세하게 설명해주십시오 rootalias, 그들의 목적은.

답변:


1074

혼란에 대한 답을 찾았습니다.

지시문 rootalias지시문 사이에는 매우 중요한 차이점이 있습니다. 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
별칭 경로의 슬래시가 필수적입니다!
mafrosis

2
이것은 모두 훌륭하지만 (구성 문제를 해결하는 데 도움이 됨) 사람들이 이러한 종류의 문제를 진단하는 데 사용할 수있는 로깅 설정이 궁금합니다. 마찬가지로, "location [...]"구성 블록과 일치하는 디렉토리 [...]를 검색하는 "[...]에 대한 요청을 수신함"과 같은 내용을 기록하기 위해 인쇄하는 모든 것
Pistos

2
@Pistos : 넣어 log_format scripts '$document_root | $uri | > $request';으로 http섹션 access_log /var/log/nginx/scripts.log scripts;servernginx를 설정 .. 섹션
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, / images의 중복을 피하는 것입니다
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 년 후인 것을 알고 있지만 별칭과 루트를 사용하는 것 사이에 성능 및 / 또는 보안 상충 관계가 있는지 설명 할 수 있습니까?
미나

1
@Mina 가능하다면 루트를 사용하는 것이 좋습니다. (docs wiki.nginx.org/HttpCoreModule#alias에 의견이 있습니다. )
Matthew Wilcoxson

이것이 내가 👍👏을 위해 온 것입니다
alienfromouterspace

6

alias는 요청 경로에서 LPP (Location Part Path)를 대체하는 데 사용되며 요청 경로 root앞에 추가하는 데 사용됩니다.

요청 경로를 최종 파일 경로에 매핑하는 두 가지 방법이 있습니다.

aliaslocation 블록에서만 사용할 수 있으며 outside를 재정의합니다 root.

aliasroot위치 블록에서 함께 사용될 수 없다.


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의 일부입니다 . 반면에 – aliaslocation 문의 지시문 인수는 URI의 일부입니다

따라서 alias특정 URI를 파일 시스템의 특정 경로에 맵핑하는 다른 이름 인 반면, root위치 인수는 root지시문에 인수로 제공된 루트 경로에 추가 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.