본문으로 건너뛰기
Advertisement

Location 블록 심화

location 블록은 Nginx에서 URL 경로별로 다른 동작 을 정의하는 핵심 기능입니다. 매칭 우선순위, try_files, alias vs root의 차이를 정확히 이해하는 것이 고급 Nginx 설정의 핵심입니다.


Location 매칭 수정자(Modifier) 완전 정리

location [수정자] 경로 {
...
}
수정자이름설명
=완전 일치URL이 정확히 일치할 때만 매칭, 매칭 시 즉시 사용
^~우선 접두사접두사 일치 + 정규식 검사 생략
~정규식 (대소문자 구분)정규식 패턴 매칭
~*정규식 (대소문자 무시)대소문자 무관 정규식 매칭
없음일반 접두사접두사 일치 중 가장 긴 것 선택

매칭 우선순위 단계별 설명

같은 URL이 여러 Location 블록과 매칭될 때 Nginx는 다음 순서로 처리합니다.

요청: GET /images/logo.png

Step 1: = (완전 일치) 검사

location = /images/logo.png {
# 이 블록이 있으면 즉시 여기서 처리, 아래 검사 없음
}

Step 2: ^~ (우선 접두사) 검사 — 가장 긴 매칭 선택

location ^~ /images/ {
# /images/로 시작하는 URL은 여기서 처리
# 정규식 검사(~, ~*)를 건너뜀
}

Step 3: ~ / ~* (정규식) 검사 — 파일 순서대로 첫 번째 매칭 선택

location ~* \.(png|jpg|gif)$ {
# 정규식에 매칭됨 (^~가 없었다면 여기 도달)
}

Step 4: 수정자 없는 일반 접두사 — 가장 긴 매칭 선택

location /images/ {
# 정규식에 매칭되지 않았다면 여기
}

Step 5: / — 모든 요청의 최후 폴백

location / {
try_files $uri $uri/ =404;
}

매칭 우선순위 정리

1순위: = (완전 일치)
2순위: ^~ (우선 접두사, 긴 것 우선)
3순위: ~, ~* (정규식, 파일 순서대로 첫 번째 매칭)
4순위: 수정자 없는 접두사 (긴 것 우선)

우선순위 실전 예제

server {
listen 80;
root /var/www/html;

# 1순위: /favicon.ico 완전 일치
location = /favicon.ico {
log_not_found off;
access_log off;
}

# 2순위: /static/ 우선 접두사 (정규식 건너뜀)
location ^~ /static/ {
expires 30d;
add_header Cache-Control "public";
}

# 3순위: 이미지 확장자 정규식
location ~* \.(png|jpg|jpeg|gif|webp|svg|ico)$ {
expires 7d;
add_header Cache-Control "public";
}

# 3순위: JS/CSS 정규식
location ~* \.(js|css)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}

# 4순위: /api/ 접두사
location /api/ {
proxy_pass http://127.0.0.1:8080;
}

# 5순위: 기본 폴백
location / {
try_files $uri $uri/ =404;
}
}

요청별 매칭 결과:

요청 URL매칭 블록이유
/favicon.ico= /favicon.ico완전 일치
/static/app.js^~ /static/우선 접두사 (정규식 건너뜀)
/images/logo.png`~* .(png...)$`
/api/users/api/ 접두사정규식 미매칭, 접두사 일치
/about/ 폴백아무것도 매칭 안 됨

try_files 지시어 완전 정복

try_files는 Nginx가 파일이나 URI를 순서대로 시도하고 없으면 마지막 폴백을 사용하는 지시어입니다.

기본 문법

try_files 파일1 파일2 ... 폴백;

일반 정적 파일 서빙

location / {
# 순서대로 시도:
# 1. $uri 파일이 실제로 존재하는가? (/about.html)
# 2. $uri/ 디렉터리가 존재하는가? (/about/)
# 3. 없으면 404 반환
try_files $uri $uri/ =404;
}

SPA(React/Vue) 클라이언트 라우팅

location / {
# 파일이 없으면 index.html로 폴백 (React Router가 처리)
try_files $uri $uri/ /index.html;
}

내부 location으로 리다이렉트

location / {
# 파일이 없으면 @fallback 내부 location 실행
try_files $uri $uri/ @fallback;
}

location @fallback {
proxy_pass http://127.0.0.1:8080;
}

PHP FastCGI와 함께 사용

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

alias vs root — 경로 처리 차이

rootalias는 둘 다 파일 시스템 경로를 지정하지만 동작 방식이 다릅니다.

root: 경로를 Location URI 앞에 붙임

location /images/ {
root /var/www;
}
# GET /images/logo.png
# → 실제 파일 경로: /var/www/images/logo.png
# (root + URI = /var/www + /images/logo.png)

alias: Location URI를 지정한 경로로 대체

location /images/ {
alias /var/www/static/photos/;
}
# GET /images/logo.png
# → 실제 파일 경로: /var/www/static/photos/logo.png
# (alias로 /images/를 /var/www/static/photos/로 교체)

비교 예제

server {
root /var/www/html; # 서버 기본 root

# root 사용: /var/www/html/assets/style.css
location /assets/ {
root /var/www/html;
# GET /assets/style.css → /var/www/html/assets/style.css
}

# alias 사용: /var/www/static/style.css (경로 교체)
location /assets/ {
alias /var/www/static/;
# GET /assets/style.css → /var/www/static/style.css
}
}

alias 사용 시 주의: alias는 반드시 끝에 /를 붙여야 합니다. 정규식 location과 함께 쓸 때는 alias가 더 적합한 경우가 많습니다.


내부 Location (@named location)

@로 시작하는 named location은 외부에서 직접 접근할 수 없고, try_files, error_page 등에서 내부 참조용으로만 사용합니다.

server {
location / {
try_files $uri $uri/ @backend;
}

# 에러 처리용 내부 location
error_page 404 @not_found;
error_page 500 502 503 504 @error;

location @backend {
proxy_pass http://127.0.0.1:8080;
}

location @not_found {
return 302 /404.html;
}

location @error {
return 302 /500.html;
}
}

Location 중첩과 상속

Location 블록은 중첩이 제한적으로 가능합니다(일부 지시어만).

location /admin/ {
auth_basic "관리자 전용";
auth_basic_user_file /etc/nginx/.htpasswd;

# 중첩 location — /admin/ 안에서 세분화
location /admin/api/ {
proxy_pass http://127.0.0.1:8080/admin/api/;
}

location /admin/static/ {
root /var/www;
}
}

정리

개념핵심 내용
완전 일치 (=)URL이 정확히 일치, 가장 높은 우선순위
우선 접두사 (^~)접두사 일치 + 정규식 검사 생략
정규식 (~, ~*)파일에 나타나는 순서로 첫 번째 매칭
일반 접두사가장 긴 매칭 선택
try_files파일 존재 여부 순서대로 시도, 없으면 폴백
rootURI에 root 경로를 앞에 붙임
aliasURI를 지정 경로로 완전 대체
@named내부 참조 전용 location
Advertisement