Daylogs/Nginx
nginx: 설정의 상속 모델
ohgyun
2016. 6. 6. 16:41
발생일: 2015.07.20
키워드: nginx, 설정, 디렉티브, directive
문제:
nginx 설정의 상속 모델에 대해 잘 설명한 포스트가 있어 요약해봤다.
해결책:
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.
}
}
참고:
원문: https://blog.martinfjordvald.com/2012/08/understanding-the-nginx-configuration-inheritance-model/
반응형