Location 블록이란?
location 블록은 Nginx에서 정의되어 있는 웹사이트의 특정 URL 을 조작하는데 사용되는 블록입니다.
Server 블록에 정의되어 있는 웹사이트마다 Location 을 지정할 수 있으며, Location 을 여러 번 정의할 수 있습니다.
Location 블록의 URL 구성과 패턴
location은 URI 경로의 일부인 prefix string이거나 정규식 표현이 될 수 있습니다.
다음 예시는 /some/path/document.html 과 같은 경로의 요청을 처리합니다.
// nginx.conf
location /some/path {
...
}
location context 안에 있는 directive는 요청을 어떻게 처리할지 정할 수 있습니다.
정적 파일(static file, ex. html, css, js file)을 보여주거나 proxy server로 요청을 전송합니다.
// nginx.conf
server {
location /images/ {
root /data;
}
location / {
proxy_pass http://www.example.com;
}
}
첫 번째 location context와 일치하는 패턴은 /data 디렉토리에서 파일들을 보여줍니다.
두 번째 location context와 일치하는 패턴은 www.example.com 도메인으로 요청을 전송합니다.
root 옵션 : 정적 파일(static file) 이 있는 파일 시스템의 경로입니다. root 뒤에 location의 경로가 추가된 상태로 파일의 경로를 찾습니다.
예시) /images/a.png의 요청이 들어오면 NGINX는 /data/images/a.png에서 파일을 찾습니다.
proxy_pass 옵션 : 위의 예시에서 /images/와 맞지 않는 모든 패턴의 요청은 프록시 서버로 전송됩니다. 이후 프록시 서버에서의 응답이 클라이언트에게 전송됩니다.
문법
location 문법은 위치 조정 부호와 패턴으로 구성됩니다.
위치 조정 부호는 특수 기호로 지정하고 패턴은 정규식 문자열을 사용할 수 있습니다.
위치 조정 부호는 선택사항입니다.
Syntax: location [ = | ~ | ~* | ^~ ] [pattern] { ... }
location @name { ... }
Default: —
Context: server, location
각 위치 조정 부호 별 사용 예시
각 위치 조정 부호에 따른 예시는 다음과 같습니다.
# 모든 요청과 일치
location / {
[ configuration A ]
}
# 정확하게 일치
# matches with /images
# does not matches with /images/index.html or /images/
location = /images {
[ configuration B ]
}
# 지정한 패턴으로 시작
# /static/ 으로 시작하는 요청과 일치 그러나 더 우선순위에 있는 location 블록 탐색함.
location /static/ {
[ configuration C ]
}
# 지정한 패턴으로 시작, 패턴이 일치 하면 다른 패턴 탐색 중지( 정규식 아님 )
# matches with /images or /images/logo.png
location ^~ /images {
[ configuration D ]
}
# 정규식 표현 일치 - 대소문자 구분
location ~ \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
# 정규식 표현 일치 - 대소문자 구분 안함
location ~* \.(gif|jpg|jpeg)$ {
[ configuration F ]
}
Location 블록 우선순위
다수의 Location 블록이 정의되어 있을 경우 Location 블록에 정의되어 있는 패턴에 우선순위에 따라 달라지게 됩니다.
1순위 = : 정규식이 정확하게 일치
예시) location = /static { ... }
2순위 ^~ : 정규식 앞부분이 일치
예시) location ^~ /static { ... }
3순위 ~ : 정규식 대/소문자 일치
예시) location ~ /static/ { ... }
4순위 ~* : 대/소문자를 구분하지 않고 일치
예시) location ~* .(jpg|png|gif)
5순위 / : 하위 일치
예시) location /static { ... }
필자가 실제로 프로젝트에 작성한 예시
Nginx 서버에 GET https://jjincafe-in-seoul.com/cafes/12345 요청이 들어오면 cafe-detail/index.html 파일을 서빙해줘야 합니다.
server {
listen 443 ssl;
server_name jjincafe-in-seoul.com;
server_tokens off;
root /usr/share/nginx;
location / {
root /usr/share/nginx/html;
}
location ~ ^/cafes/[1-9]+$ {
try_files $uri /cafes/cafe-detail/index.html;
}
}
출처
http://nginx.org/en/docs/beginners_guide.html
https://www.digitalocean.com/community/tutorials/nginx-location-directive