nginx의 location 디렉티브는 클라이언트로부터 들어오는 요청을 경로(URL) 기준으로 처리하는 중요한 기능 중 하나이다. 서버가 다양한 요청을 적절히 처리하기 위해서 요청경로에 따라 다른 설정을 적용해야 하는 경우가 많다. 예를 들어, 정적인 파일을 특정 디렉토리에서 제공하거나, 특정 API요청을 백엔드 애플리케이션으로 전달하는 것과 같은 상황에서 location 디렉티브를 사용하게 된다.
location 기본 개념
특정 경로 또는 특정 경로의 패턴 등을 정의하는 블록을 만든다. 그리고 그 블록안에 해당 경로의 요청이 들어왔을 때 실행할 것들을 정의한다. 즉, 경로를 기반으로 서버가 어떻게 동작하고 응답할 것인지 결정한다.
location 디렉티브 형식
location [매칭 규칙] [경로] {
# 해당 경로에 대한 처리 설정
}
location 매칭 방법
정확한 일치 =
= 기호를 사용하여 경로가 정확히 일치하는 경우에만 해당한다. 이 방식은 가장 높은 우선순위를 가지며, 예를 들어 /about 이라는 요청에만 대응하는 블록을 설정할 수 있다.
location = /about {
return 200 "About page";
}
설명 : /about과 동일한 주소를 가질 때 실행된다.
정규표현식 일치 ~, ~*
정규 표현식을 사용하여 경로를 매칭할 수 있다. ~ 는 대소문자를 구분하고, ~* 는 대소문자를 구분하지 않는 매칭 방식이다. 이 방식은 파일 확장자 필터링 등 다양하고 복잡한 경로 처리에 적합하다.
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
설명 : .php 확장자로 끝나는 파일에 접근 할때 실행된다.
접두어 일치 ^~
경로의 접두어가 일치할 경우에 이 블록이 실행된다. 이 방식은 정규표현식 블록보다 우선순위가 높으며, 주로 정규표현식을 피하고자 할 때 사용된다. 예를 들어 /images/ 경로에 대해 더 명확하게 처리하려면 ^~ 구문을 사용할 수 있다.
location ^~ /images/ {
root /var/www/images;
}
일반적인 접두어 일치
가장 기본적인 매칭방식으로, 요청 경로의 접두어가 일치하는 경우 이 블록이 선택된다. 이 방식은 정확한 일치나 정규표현식보다 우선순위가 낮으며, 가장 긴 경로가 일치하는 블록이 선택된다.
location /blog {
root /var/www/blog;
}
우선순위
Nginx는 여러 개의 location 블록이 있을 경우, 다음과 같은 우선순위 규칙에 따라 가장 적합한 블록을 선택한다:
정확한 일치 (=): 경로가 완전히 일치하는 경우 우선적으로 선택된다.
정규 표현식 일치 (~, ~*): 정규 표현식으로 매칭되는 경우가 그다음으로 선택된다.
접두어 일치 (^~): 경로의 접두어가 일치하는 경우, 정규 표현식을 무시하고 이 블록이 선택된다.
일반적인 접두어 일치: 나머지 경로 중 가장 길게 일치하는 경로가 선택된다.
주의사항
경로의 일관성
경로의 일관성을 유지하는 것이 중요하다. 예를 들어, /about과 /about/은 다른 경로로 인식될 수 있다. 이를 명확히 구분하거나 처리하는 설정을 추가해야 한다.
정규 표현식 사용 주의
정규 표현식을 사용할 때는 표현식이 너무 광범위하거나 불필요하게 복잡하지 않도록 주의해야 한다. 예를 들어, .php와 .php7을 구분하지 않으면 의도하지 않은 파일이 처리될 수 있다.
우선순위 확인
여러 개의 location 블록이 있을 때, 우선순위가 어떻게 적용되는지 주의 깊게 확인해야 한다. 예기치 않은 경로가 잘못된 블록에서 처리되는 경우가 발생할 수 있다.