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 — 경로 처리 차이
root와 alias는 둘 다 파일 시스템 경로를 지정하지만 동작 방식이 다릅니다.
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 | 파일 존재 여부 순서대로 시도, 없으면 폴백 |
root | URI에 root 경로를 앞에 붙임 |
alias | URI를 지정 경로로 완전 대체 |
@named | 내부 참조 전용 location |