Nginx 정적 서비스 설정 - 루트 와 alias 명령 을 자세히 설명 합 니 다.

12310 단어
정적 파일
Nginx 는 고성능 으로 유명 하 며 전단 역방향 프 록 시 서버 를 자주 사용 합 니 다.또한 nginx 는 고성능 정적 파일 서버 이기 도 합 니 다.보통 정적 파일 을 nginx 로 처리 합 니 다.
nginx 의 정적 파일 을 설정 하 는 데 는 두 개의 명령 이 있 습 니 다. 하나의 root 와 하나의 alias 가 있 습 니 다.이 두 명령 에 대해 경로 뒤에 슬 래 쉬 를 붙 여야 하 는 지 여 부 는 사람 을 어 지 럽 히 기 쉽다. 본 고 는 서로 다른 일치 규칙 을 시도 함으로써 비교적 통용 되 는 설정 방식 을 요약 했다.
기본 설정
간단 한 Nginx Location Url 설정 노트 와 같이 본 고 는 vagrant 가상 컴퓨터 의 nginx 를 사용 합 니 다.기본 설정 은 다음 과 같 습 니 다.
/etc/nginx/sites-enabled/pro.conf
server {
        listen 80 default_server;


        server_name localhost;

        access_log /var/log/nginx/pro/access.log;
        error_log /var/log/nginx/pro/error.log;

        error_page 404 /404.html;

        root /vagrant/pro;
        index index.html index.htm;

}

항목 의 디 렉 터 리 는 다음 과 같 습 니 다.
☁  pro  tree
.
├── 403.html
├── 404.html
├── index.html
├── static
│   ├── flask
│   │   └── m.png
│   └── stc.jpg
└── upload
    └── up.png

3 directories, 6 files

각각 두 개의 정적 폴 더 가 있 는데 하 나 는 static 이 고 다른 하 나 는 upload 입 니 다.
처음 본 루트
루트 는 지정 한 항목 의 루트 디 렉 터 리 로 server 와 location 에 적 용 됩 니 다.여러 개 를 지정 할 수 있 습 니 다. location 이 지정 되 지 않 으 면 외부 server 나 http 에서 계승 을 찾 습 니 다.
방문 http://192.168.33.10/static/stc.jpg 하면 그림 이 되 돌아 온 것 을 발견 할 수 있 습 니 다.우 리 는 아직 location 를 설정 하지 않 았 는데, 왜 파일 을 정확하게 찾 을 수 있 습 니까?root 또는 alias 명령 을 배 울 때 가장 좋 은 방법 은 파일 확장자 에 문 자 를 붙 여 하 드 디스크 에 존재 하지 않 게 하 는 것 이다. 그러면 nginxerror.log 에서 nginx 가 파일 을 찾 는 방식 을 볼 수 있다.http://192.168.33.10/static/stc.jpgx 에 접근 한 다음 /var/log/nginx/pro/error.log 파일 을 보면 다음 과 같은 오류 정 보 를 볼 수 있 습 니 다.
2016/09/28 07:41:48 [error] 4416#0: *70 open() "/vagrant/pro/static/stc.jpgx" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpgx HTTP/1.1", host: "192.168.33.10"

/vagrant/pro/static/stc.jpgx 파일 이 존재 하지 않 습 니 다.확실히 우 리 는 이 서류 가 없다.파일 이름 이 정확 하면 접근 할 수 있 습 니 다. server 에서 지정 한 root /vagrant/pro 때 문 입 니 다. 이 디 렉 터 리 에서 파일 을 찾 습 니 다. url 의 주 소 는 파일 의 경로 와 일치 하기 때 문 입 니 다.
 http://192.168.33.10  /static/stc.jpg 
 /vagrant/pro          /static/stc.jpg

이 를 통 해 nginx 에서 root 명령 의 주 소 는 일치 하 는 url 의 host 를 바 꾼 것 으로 추정 된다.
루트 명령 어
위의 추측 을 검증 하기 위해 서 는 몇 개의 location 을 더 써 서 실험 을 해 야 한다.다음 위치 설정 을 추가 합 니 다:
location ^~ /static {
    root /vagrant/pro/static;
}

다시 방문 http://192.168.33.10/static/stc.jpg 하면 그림 이 표시 되 지 않 습 니 다. error. log 를 보고 다음 과 같이 되 돌려 줍 니 다.
2016/09/28 07:48:57 [error] 5978#0: *71 open() "/vagrant/pro/static/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"

nginx 는 주 소 를 /vargrant/pro/static/static/stc.jpg 하나의 static 로 인식 하고 위의 규칙 을 사용 합 니 다. 그 조합 은 192.168.33.10 = = /vagrant/pro/static 이 고 url 은 /static/stc.jpg 입 니 다.교환 하면 /vagrant/pro/static + /static/stc.jpg 를 얻 을 수 있 습 니 다.잘못된 error 와 일치 합 니 다.해결 방안 은 루트 의 static 를 제거 하면 바로 그림 에 접근 할 수 있 습 니 다.
그렇다면 폴 더 staticstc 라 고 명명 하면 그 결 과 는 어떻게 될 까?
location ^~ /static {
    root /vagrant/pro;
}

접근 http://192.168.33.10/static/stc.jpg 오류 가 발생 했 습 니 다:
2016/09/28 07:54:46 [error] 5992#0: *73 open() "/vagrant/pro/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"

계산 경로 /vagrant/pro + /static/stc.jpg, 파일 을 찾 을 수 없습니다 /vagrant/pro/static/stc.jpg. 앞에서 말 한 규칙 에 맞 게 location 을 수정 하려 고 시도 합 니 다.
location ^~ /stc {
    root /vagrant/pro;
}

url 이 바 뀌 었 기 때문에 방문 http://192.168.33.10/stc/stc.jpg 해 야 그림 을 찾 을 수 있 습 니 다.이제 stc 폴 더 를 static 로 바 꿉 니 다.
루트 와 슬 래 쉬
많은 사람들 이 경로 의 마지막 평행봉 / 을 추가 해 야 하 는 지 의 심 스 러 울 것 이다.location 의 static 뒤의 슬 래 쉬 는 일치 하 는 url 과 관련 이 있 으 며 더 이상 군말 하지 않 습 니 다.루트 의 경로 의 슬 래 쉬 / 는 다시 실험 을 통 해 확인 할 수 있 습 니 다.위 치 를 다음 과 같이 설정 합 니 다:
location ^~ /static/ {
   root /vagrant/pro/;
}

접근 http://192.168.33.10/static/stc.jpg 모든 것 이 정상 입 니 다. 접근 http://192.168.33.10/static/stc.jpg, error 는 "/ vagrant / pro / static / stc. jpgs" 파일 을 찾 을 수 없습니다.
루트 에 따라 host 를 바 꾸 는 규칙 이 있다 면, 바 꾸 는 과정 은?/vagrant/pro/ + /static/stc.jpg == /vagrant/pro//static/stc.jpg 。* nix 시스템 에서 여러 개의 철봉 과 하나의 철봉 은 등가 이다. 즉 /vagrant/pro//static/stc.jpg/vagrant/pro/static/stc.jpg 와 같다.
이렇게 되면 루트 경로 뒤의 슬 래 쉬 바 는 효과 가 없 는 것 과 같 습 니 다.그렇다면 이런 설정 을 생각 하 는 사람 이 있 을 것 이다.
location ^~ static/ {
    root /vagrant/pro;
}

설치 하기 전에 위 에 있 는 알고리즘 이 있 으 면 /vagrant/pro + static/stc.jpg 일 것 입 니 다. 더 한 것 은 /vagrant/prostatic/stc.jpg 일 것 입 니 다. 이치 에 따 르 면 잘못된 것 같 지만 사실은 그림 에 접근 할 수 있 습 니 다.괴이 한 일?
앞의 nginx location 의 url 일치 규칙 에 대해 알 고 있다 면 사실 ^~ static/ 이 일치 하지 않 음 을 알 수 있 을 것 입 니 다.위치 수정
location ^~ static/ {
    rewrite ^ http://google.com;
   # root /vagrant/pro;
}

방문 http://192.168.33.10/static/stc.jpg 은 여전히 그림 을 얻 을 수 있 습 니 다. 구 글 을 뛰 지 않 았 다 는 것 은 일치 하지 않 았 다 는 것 을 의미 합 니 다 ^~ static/.
사실 원리 도 간단 합 니 다. 우리 의 첫 번 째 실험 을 기억 합 니 다. 패션 이 location 를 설정 하지 않 았 을 때 도 그림 으로 돌아 갈 수 있 습 니 다.맞습니다. ^~ static/ 일치 하지 않 음 에 도 불구 하고 바깥쪽 server 는 root 를 /vagrant/pro 로 정의 하 였 으 므 로 그림 을 검색 하여 정상적으로 되 돌려 주 고 바깥쪽 root 를 주석 하여 다시 방문 합 니 다.404 를 얻 을 수 있 습 니 다. error 는 다음 과 같 습 니 다.
2016/09/28 08:18:15 [error] 6227#0: *82 open() "/usr/share/nginx/html/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"
/usr/share/nginx/html/static/stc.jpg 루트 가 지정 되 지 않 아 도 nginx 기본 값 에 루트 가 있다 는 뜻 입 니 다. /usr/share/nginx/html물론 이 설정 은 ^~ static/ 과 관계 가 없습니다.~ static/stc.jpgs? 이면 명중 할 수 있 고 이때 사진 을 방문 하면 정확 한 해석 이 가능 하기 때문에 /vagrant/pro + static/stc.jpg 이런 상황 은 존재 하지 않 는 다.이 곳 을 이해 하 는 관건 은 루트 가 host 를 교체 하고 일치 하 는 url 을 추가 하 는 것 입 니 다. 일치 하 는 url 은 당연히 앞의 슬 래 쉬 를 포함 하고 일치 하 는 부분의 url 은 그렇지 않 습 니 다.~ static/stc.jpgs? 모드 에 대해 url http://192.168.33.10/static/stc.jpg 방문
  • 일치 하 는 url 은 / static / stc. jpg
  • 입 니 다.
  • 일치 하 는 부분의 url 은 static / stc. jpg
  • 입 니 다.
    이것 을 파악 하 는 것 은 매우 중요 하 며, 뒤쪽 alias 명령 과 평행봉 의 관계 와 직 결 된다.
    루트 명령 에 대해 우 리 는 귀납 할 수 있다.
  • 일치 하 는 url 주소 에 대해 일치 하 는 location 의 루트 경 로 를 url 에 접근 하 는 host 로 바 꾸 면 파일 의 실제 주 소 를 얻 을 수 있 습 니 다.(여러 개의 평행봉 은 사실 하나의 평행봉 과 같다)
  • location 과 일치 하지 않 으 면 더 바깥쪽 루트 를 찾 아 교체 합 니 다.
  • 루트 명령 의 마지막 슬 래 쉬 바 는 추가 할 수 있 고 추가 하지 않 을 수 있 습 니 다.

  • alias 명령 어
    루트 에 대해 서 는 루트 주 소 를 host 로 바 꾸 면 하 드 디스크 경로 (실제 주소) 에 파일 이 있 습 니 다.alise 에 대해 서 는 일치 하 는 url 주 소 를 바 꾸 는 것 이 아니 라 일치 하 는 부분의 url 을 바 꾸 는 것 입 니 다.alias 명령 도 여러 개 있 을 수 있 습 니 다.
    location 을 추가 합 니 다. 루트 와 거의 같 습 니 다.
    location ^~ /upload {
       alias /vagrant/pro;
    }
    

    접근 http://192.168.33.10/upload/up.png 그림 이 없습니다. error 를 보면 다음 과 같 습 니 다.
    2016/09/28 08:36:18 [error] 6312#0: *90 open() "/vagrant/pro/up.png" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /upload/up.png HTTP/1.1", host: "192.168.33.10"
    
    

    이 를 통 해 알 수 있 듯 이 alias 의 모델 은 /vagrant/pro + /upload/up.png 가 아니 라 /vagrant/pro + /up.png 이다.
    alias 라 는 단 어 는 컴퓨터 에서 자주 사용 되 는데 글자 그대로 '별명' 이라는 뜻 으로 이름 을 바 꾸 는 것 이 바로 이름 을 바 꾸 는 것 이다.실제 교체 규칙 은 일치 하 는 url 주 소 를 alias 의 경로 로 바 꾸 면 됩 니 다.예 를 들 어 상기 사례 교체 과정 은 다음 과 같이 모 의 할 수 있다.
    프로 세 스
    패턴 또는 url
    url 모드
    ^~ /upload
    alias 경로
    /vagrant/pro
    접근 주소
    http://192.168.33.10/upload/up.png
    일치 하 는 부분 주소
    /upload + /up.png
    바꾸다
    /upload == /vagrant/pro
    결실
    /vagrant/pro + /up.png
    그림 접근 을 수정 하기 위해 locaton 을 다음 과 같이 수정 합 니 다.
    location ^~ /upload {
        alias /vagrant/pro/upload;
    }
    

    이때 방문 http://192.168.33.10/upload/up.png 하면 정확 한 그림 을 얻 을 수 있 습 니 다. 위의 계산 과정 을 모방 하면:
    프로 세 스
    패턴 또는 url
    url 모드
    ^~ /upload
    alias 경로
    /vagrant/pro/upload
    접근 주소
    http://192.168.33.10/upload/up.png
    일치 하 는 부분 주소
    /upload + /up.png
    바꾸다
    /upload == /vagrant/pro/upload
    결실
    /vagrant/pro/upload + /up.png
    결 과 를 통 해 알 수 있 듯 이 파일 경 로 를 정확하게 찾 았 습 니 다. 만약 에 alias 명령 경로 에 슬 래 쉬 를 더 하면 처리 한 파일 경 로 는 다음 과 같 습 니 다.
    /upload == /vagrant/pro/upload
    /vagrant/pro/upload/ + /up.png
    

    여러 개의 평행봉 은 합법적이다.평행봉 과 같은 상황.
    아래 에서 location 을 다음 과 같이 수정 합 니 다.
    location ^~ /upload/ {
       alias /vagrant/pro/upload;
    }
    

    이 때 일치 하 는 url 은 /upload/ + up.jpg 로 바 뀌 었 습 니 다. 그러면 바 꾼 결 과 는 /vagrant/pro/upload + up.png 이 고 /vagrant/pro/uploadup.png 의 경 로 는 불법 입 니 다. error 에서 도 바 꾼 오 류 를 볼 수 있 습 니 다.
    2016/09/28 08:52:44 [error] 6452#0: *92 open() "/vagrant/pro/uploadup.png" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /upload/up.png HTTP/1.1", host: "192.168.33.10"
    

    해결 방법 도 간단 하 니 /vagrant/pro/upload/vagrant/pro/upload/ 로 바 꾸 면 된다.이 를 통 해 알 수 있 듯 이 alias 의 마지막 슬 래 쉬 는 루트 명령 처럼 있 으 나 마 나 하지 않 습 니 다. 필요 한 지 여 부 는 loacation 의 url 매 칭 모드 에 달 려 있 습 니 다.
    앞의 루트 모드 에서 뿌리 가 없 는 슬 래 쉬 ~ static/stc.jpgs? 를 고려 하면 alias 의 경우 오 류 를 포착 하기 어 려 울 수 있 습 니 다.location 설정 이 다음 과 같 으 면:
    location ^~ upload/ {
          alias /vagrant/pro/upload/;
    }
    

    바 꾼 파일 경 로 는 /vagrant/pro/upload/up.png 이 어야 합 니 다. 그러나 실제 테스트 에서 alias 를 설정 하면 301 의 방향 을 바 꿀 수 있 습 니 다. alias 디 렉 터 리 가 autoindex 를 열지 않 으 면 403 오류 가 발생 합 니 다.구체 적 인 상황 은 아직 알려 지지 않 았 습 니 다. nginx 의 bug 인지 아 닌 지 모 르 겠 습 니 다.이러한 상황 을 피하 기 위해 alias 를 사용 할 때 location ^~ upload/ 모드 를 설정 하지 않 고 루트 에서 url 을 지정 하지 않 아 도 이도 저도 아 닌 것 처럼 보 입 니 다.
    alise 는 별명 으로서 루트 보다 url 의 경로 가 파일 경로 와 같 지 않 아 도 된다 는 것 이 좋 습 니 다. alise 는 host 를 교체 하 는 것 이 아니 라 일치 하 는 부분의 host 를 교체 하 는 것 이기 때 문 입 니 다.설정 수정:
    location ^~ /upload/ {
        alias /vagrant/pro/static/;
    }
    

    url 에 upload 가 있 음 에 도 불구 하고 static 디 렉 터 리 에 있 는 파일 에 접근 http://192.168.33.10/upload/stc.jpg 하거나 http://192.168.33.10/upload/flask/m.png 할 수 있 습 니 다.
    교체 규칙 도 간단 하 다. /upload/ = /vagrant/pro/static/ 획득 /vagrant/pro/static/ + stc.jpg 또는 /vagrant/pro/static/ + flask/m.png.
    총결산
    nginx 의 정적 파일 설정 에서 루트 와 alias 명령 이 모두 실 현 됩 니 다.헷 갈 리 지 않도록 루트 경로 가 없 는 url 모드 를 쓰 지 마 세 요. 즉, static/ 와 같은 시작 을 피하 고 루트 경로 의 슬 래 쉬 는 유지 해 야 합 니 다. 루트 경로 가 없 는 것 도 이상 합 니 다.
    루트 와 alias 의 차 이 는 주로 교체 하 는 부분 에 있 습 니 다. 루트 모드 에 서 는 루트 설정 경 로 를 일치 하 는 url 의 host 로 바 꿉 니 다.alias 는 url 에 일치 하 는 부분 을 바 꾸 기 위해 지정 한 경 로 를 지정 합 니 다.명령 중의 슬 래 쉬 는 루트 명령 에 영향 을 주지 않 으 며, alise 는 교체 규칙 에 따라 일치 하면 됩 니 다.
    루트 명령 어
    location /dir/ 
    root root_path ->  http://host/dir/file.txt  -> root_path/dir/file.txt
    

    alias 명령 어
    location /dir
    alias alias_path ->  http://host /dir /file.txt  -> alias_path/file.txt
    
    location /dir/ 
    alias alias_path/ ->  http://host /dir/ file.txt  -> alias_path/file.txt
    

    루트 와 alise 를 알 게 된 후에 가장 좋 은 것 은 프로젝트 의 루트 를 설정 하 는 것 이 고 다른 폴 더 는 alias 를 사용 합 니 다. 왜냐하면 alias 는 더욱 유연 하기 때 문 입 니 다.

    좋은 웹페이지 즐겨찾기