nginx: 설정의 상속 모델

발생일: 2015.07.20

키워드: nginx, 설정, 디렉티브, directive

문제:


해결책:

nginx에서는 아래 6개의 컨텍스트가 존재한다.

 - Global.
 - Http.
 - Server.
 - If.
 - Location.
   - Nested Location.
   - If in location.
   - limit_except.

기본 상속 모델은 부모 블럭에서 자식 블럭으로 상속받는 순이다. 형제 블럭이나 부모 블럭으로 전달되는 경우는 없다.

nginx에서 상속이 동작하는 방식은 아래 4개의 타입으로 구분할 수 있다.

- Normal directive
컨텍스트 당 한 개의 값 (예: root, index)
- Array directive
컨텍스트에서 여러 개의 값을 갖는 디렉티브 (예: access_log, fastcgi_param)
- Action directive
설정과 다른 액션을 수행하는 디렉티브 (예: rewrite, fastcgi_pass)
- try_files directive



Normal directives
- 정의하지 않을 경우 부모 블럭의 것을 상속한다.
- 자식 블럭에서 부모의 것과 동일한 디렉티브를 정의한 경우, 부모의 것을 오버라이트한다.

- 예) root

server {
    root /home/user/public_html;
 
    location /app {
        root /usr/share; # This results in /usr/share/app
                         # Full URI is ALWAYS appended.
    }
 
    location /app2 {
        // Server context root applies here.
    }
}


Array directives
- 정의하지 않을 경우 부모 블럭의 것을 상속한다.
- 동일한 디렉티브를 여러 번 정의할 경우, 추가할 수 있다.
- 자식 블럭에서 부모의 것과 동일한 디렉티브를 정의한 경우, 부모의 것을 오버라이트한다.
- 따라서, 여러 개를 정의했다면 자식 블럭에도 중복으로 정의해줘야 한다.

- 예) access_log, fastcgi_param

server {
    access_log /var/log/nginx/access.log;
    include fastcgi.conf;
 
    location ~ ^/calendar/.+\.php$ {
        access_log /var/log/nginx/php-requests.log; # If this executes then server context one never does.
 
        fastcgi_param ENV debug; # This *overwrites* the higher context array.
        include fastcgi.conf     # Therefore we include it in *this* context again.
    }
}


Action directives
- 부모의 것을 상속하지 않는다.
- 자식 블럭에서 재정의하더라도, 각 컨텍스트에서 실행된다.

- 예) rewrite, try_files

server {
    rewrite ^/booking(.*) /calendar$1 permanent; # Always executes.
 
    location /calendar {
        rewrite ^ /index.php; # Can execute in addition to and does not replace server context rewrites.
    }
}

하지만, Action directive의 동작은 그렇게 단순하지만은 않다. location 블럭 내에서는 3가지 컨텍스트가 존재할 수 있는데(location, if, limit_except), 이런 상황에서의 동작 방식은 상황에 따라 다르다. 문서에도 각 케이스에 대한 자세한 설명은 없으므로, 테스트해보면서 확인해보는 게 필요하다.

server {
    location /calendar {
        rewrite ^ /static.php; # Executes unless inner location matches.
 
        location ~ \.php$ {
            fastcgi_pass backend; # Outer location context rewrite is not executed.
        }
    }
}


try_files
server 블럭에서 try_files 를 정의하는 경우, nginx 에서는 최하위 우선순위를 갖는 슈도 location 블럭을 생성한다.
따라서, 매칭되는 location 블럭이 있다면 server 블럭 내의 try_files 는 실행되지 않는다. 만약, `location /`를 정의했다면, (이 룰은 모든 요청에 매칭되므로) try_files 는 절대 실행되지 않는다.

server {
    try_files $uri /index.php; # This never executes.
 
    location / {
        # Whatever here, or empty.
    }
 
    location ~ \.php$ {
        # If this location executes then try_files still does not execute.
        # Even if location / did not exist.
    }
}



참고:


저작자 표시 비영리 변경 금지
신고

카테고리

분류 전체보기 (659)
About me. (6)
Daylogs (624)
영어공부 (0)
My works - 추억 (29)
비공개 (0)