본문 바로가기
Linux

[Nginx] 하나의 서버에서 path로 서비스 분기하기

by pocket.dev 2024. 9. 3.
반응형

 

서비스 분기 구조도

 

하나의 AWS EC2 인스턴스에 여러 서비스를 띄우고 base url 뒤에 붙어서 들어오는 path로 서비스를 분기하도록 하려고 Nginx를 사용했다.

base_url/path1 --> port 3000번에 띄워진 서비스에 접근

base_url/path2 --> port 3001번에 띄워진 서비스에 접근 

base_url/path3 --> port 3002번에 띄워진 서비스에 접근 

 

1. Nginx default 파일 접근

$ sudo vi /etc/nginx/sites-available/default

 

2. location 블럭 수정

default 파일을 보면 location /  이 정의되어있는 부분이 있다. 이 부분을 다음과 같이 path와 서비스 주소에 맞게 수정해주면 된다.

location /path1/ {
   proxy_pass http://127.0.0.1:3000;
   rewrite ^/path1/(.*)$ /$1 break;
}

location /path2/ {
   proxy_pass http://127.0.0.1:3001;
   rewrite ^/path2/(.*)$ /$1 break;
}

location /path3/ {
   proxy_pass http://127.0.0.1:3002;
   rewrite ^/path3/(.*)$ /$1 break;
}

location / {
   # ...
}

 

proxy_pass는 전달하는 데 쓰는걸 알겠는데, 그럼 그 아래에 작성한 rewrite 구문은 무엇일까?

만약 내가 접근하고 싶은 주소가 http://127.0.0.1:3000/write인데, 그러기 위해서 http://sample.com/path1/write로 접근을 하면 http://127.0.0.1:3000/path1/write로 전달이 되기 때문에 /path1로 시작하는 api가 선언되어있지 않으면 404 Not Found가 뜨기 때문이다. 

그러기 위해서 실제로 3000번 포트에 있는 서비스에 path를 전달할 때는 /path1 부분을 제외하고 전달해줘야 하는데, 그 때를 위한 것이 rewrite이다.

 

rewrite 구문 해석

예시 구문: rewrite ^/path1/(.*)$ /$1

  • ^: path로 들어온 문자열의 시작임을 표시
  • .*: 남은 문자열 전부
    • Dot(.): 줄바꿈 문자(\n)을 제외한 모든 문자
    • *: 0번부터 무한대로 반복
  • $: path로 들어온 문자열의 마지막임을 표시
  • $1: (.*) 부분에 들어가있는 문자열

즉, ^/path1/(.*)$ /$1은 path로 들어온 문자열에서 /path1/을 제외한 나머지 문자열을 사용하겠다는 것으로 해석할 수 있다.

http://sample.com/path1/write/something이 호출된다면 

rewrite /path1/write/something /write/something이 만들어지면서 http://127.0.0.1:3000/write/something으로 접근을 하게 된다.

반응형
Buy Me A Coffee