Nginx의 location 지시문은 클라이언트 요청 URI에 따라 라우팅을 제어하는 핵심 메커니즘입니다. 요청이 수신되면 Nginx는 URI를 정규화(퍼센트 인코딩 디코딩, 상대 경로 해석, 중복 슬래시 제거 등)한 후, 구성된 location 블록과 매칭을 수행합니다.
매칭 문법 및 수식어(Modifiers)
location 블록은 다양한 수식어를 사용하여 매칭 조건을 세밀하게 제어할 수 있습니다.
=: 요청 URI와 정확히 일치할 때만 매칭됩니다. 가장 빠른 처리 속도를 제공합니다.^~: 접두사 기반 매칭입니다. 가장 긴 접두사가 매칭되면, 이후 정규식 검사를 즉시 중단합니다.~: 대소문자를 구분하는 정규 표현식(Regex) 매칭입니다.~*: 대소문자를 구분하지 않는 정규 표현식 매칭입니다.@: 클라이언트가 직접 요청할 수 없는 명명된 location입니다.error_page나try_files를 통한 내부 리디렉션에만 사용됩니다.
매칭 우선순위 및 알고리즘
Nginx는 요청 URI를 처리할 때 다음 순서로 location을 평가합니다.
- 정확 매칭 (=): URI가 정확히 일치하면 즉시 매칭이 종료됩니다.
- 우선 접두사 매칭 (^~): 일치하는 가장 긴 접두사 location을 찾으면 정규식 검사를 건너뛰고 해당 블록을 사용합니다.
- 정규식 매칭 (~, ~*): 설정 파일에 정의된 순서대로 위에서부터 검사합니다. 먼저 매칭되는 정규식 블록이 선택됩니다.
- 일반 접두사 매칭 (수식어 없음): 정규식 매칭 전에 가장 긴 접두사 location을 임시로 기억해 둡니다. 정규식에 매칭되는 것이 없으면 이 임시 결과가 최종 선택됩니다.
요약하자면, 우선순위는 (=) > (^~) > (~, ~*) > (일반 접두사) 순서로 적용됩니다. 단, 정규식 매칭은 설정 파일의 작성 순서에 의존합니다.
구성 예제 및 동작 검증
다음 예제에서는 Nginx 내장 지시문인 return을 사용하여 각 매칭 규칙의 동작을 검증합니다.
1. 정확 매칭 (=)과 일반 접두사 매칭
server {
listen 80;
server_name api.example.io;
# 일반 접두사 매칭
location /api/v1 {
return 200 "General Prefix Match: /api/v1";
}
# 정확 매칭
location = /api/v1 {
return 200 "Exact Match: /api/v1";
}
}
curl api.example.io/api/v1 요청은 정확 매칭에 의해 "Exact Match"를 반환합니다. 반면, curl api.example.io/api/v1/users는 일반 접두사 매칭으로 라우팅됩니다.
2. 정규식 차단 접두사 매칭 (^~)
server {
listen 80;
server_name assets.example.io;
# 정규식 매칭 (이미지 확장자)
location ~* \.(png|jpg|jpeg)$ {
return 200 "Regex Image Match";
}
# ^~ 접두사 매칭
location ^~ /static/images/ {
return 200 "Prefix Match with Regex Suppression";
}
}
assets.example.io/static/images/logo.jpg 요청은 ^~ 규칙에 의해 "Prefix Match with Regex Suppression"를 반환합니다. ^~가 정규식 ~*보다 우선하여 검사를 중단시키기 때문입니다.
3. 대소문자 구분 정규식 (~) 및 비구분 정규식 (~*)
server {
listen 80;
server_name media.example.io;
# 대소문자 구분 정규식
location ~ ^/secure/ {
return 200 "Case-Sensitive Regex Match";
}
# 대소문자 비구분 정규식
location ~* \.(mp4|mkv)$ {
return 200 "Case-Insensitive Video Match";
}
}
media.example.io/Secure/는 404를 반환하지만, media.example.io/secure/는 정규식에 매칭됩니다. media.example.io/video.MP4는 대소문자 비구분 정규식에 의해 정상적으로 매칭됩니다.
보안 및 접근 제어 구성
location 블록 내부에서 IP 기반 접근 제어 및 기본 인증을 설정할 수 있습니다.
IP 기반 접근 제어
allow와 deny 지시문을 사용하여 특정 IP 대역의 접근을 제어합니다. 규칙은 위에서 아래로 순차적으로 평가됩니다.
location /admin/ {
allow 10.0.0.0/8;
allow 192.168.1.50;
deny all;
return 200 "Admin Panel Access Granted";
}
HTTP 기본 인증
auth_basic 모듈을 사용하여 사용자 이름과 비밀번호를 요구할 수 있습니다.
location /private/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
return 200 "Private Content";
}
비밀번호 파일(.htpasswd)은 htpasswd -c -m /etc/nginx/.htpasswd admin_user와 같은 명령어를 사용하여 해시된 비밀번호로 생성해야 합니다.