Nginx 설정 변경: /api/me/* 요청을 3001 포트로 격리하여 API 라우팅 최적화
Nginx 설정 변경으로 /api/me/* 요청을 3001 포트로 격리하여 API 라우팅을 최적화하고 서비스 격리를 강화하는 방법을 설명합니다.
API 라우팅 최적화와 서비스 격리 강화가 필요했다. 기존 인프라 구성에서 몇 가지 개선점을 발견했고, 이를 해결하기 위해 Nginx 설정을 변경하기로 했다. 특히 /api/me/* 와 같이 특정 API 요청들을 별도의 포트로 분리하여 관리하고 싶었다.
시도와 함정
처음에는 간단하게 location 블록을 추가해서 시도했다. /api/me/ 로 들어오는 요청을 proxy_pass 를 통해 http://localhost:3001 로 넘기려고 했다.
server { listen 80; server_name example.com;location /api/me/ { proxy_pass http://localhost:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://localhost:3000; # 다른 API proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
문제는 /api/me/ 뒤에 오는 경로들이 제대로 전달되지 않는다는 점이었다. 예를 들어 /api/me/profile 로 요청하면 http://localhost:3001/ 로만 전달되어 404 에러가 발생했다. Nginx 의 location 블록 동작 방식을 제대로 이해하지 못했던 것이다. 3시간 정도 삽질 끝에 location 블록의 경로 매칭 방식에 대한 이해가 부족했음을 깨달았다.
원인
Nginx 의 location 블록은 기본적으로 접두사 매칭을 사용한다. location /api/me/ 는 /api/me/ 로 시작하는 모든 경로에 매칭되지만, 뒤에 붙는 경로를 그대로 전달하지 않고 proxy_pass 에 지정된 URL 뒤에 붙여버리는 문제가 있었다. location /api/me/ 뒤에 오는 경로를 그대로 유지하려면 proxy_pass 설정에 대한 추가적인 고려가 필요했다.
해결
이 문제를 해결하기 위해 location 블록의 경로를 정규 표현식으로 변경하고, rewrite 지시어를 사용하여 경로를 재작성했다. /api/me/ 로 시작하는 요청을 http://localhost:3001/ 로 정확하게 프록시하도록 설정을 수정했다.
server { listen 80; server_name example.com;location ~ ^/api/me/(.*)$ { proxy_pass http://localhost:3001/$1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://localhost:3000; # 다른 API proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
정규 표현식 ~ ^/api/me/(.*)$ 는 /api/me/ 로 시작하고 그 뒤에 어떤 문자열이 오든((.*)) 모두 잡아낸다. 그리고 $1 을 proxy_pass 의 URL 뒤에 붙여서 원래 요청 경로의 나머지 부분을 그대로 전달하게 된다.
결과
/api/me/*요청이localhost:3001포트로 성공적으로 격리되었다.- API 라우팅이 최적화되어 요청 처리가 더 효율적으로 이루어졌다.
- 서비스 격리가 강화되어 특정 API의 장애가 다른 서비스에 미치는 영향을 최소화할 수 있게 되었다.
정리 — 같은 함정 안 빠지려면
- [ ] Nginx
location블록의 경로 매칭 방식 (접두사 vs 정규 표현식)을 정확히 이해하자. - [ ]
proxy_pass와 함께 경로를 재작성해야 할 때는rewrite지시어나 정규 표현식 캡처 그룹($1)을 활용하는 것을 고려하자. - [ ] 특정 경로 패턴을 분리할 때는
location블록의 순서와 우선순위도 중요하다. - [ ] 변경 후에는 반드시 다양한 경로로 테스트하여 예상대로 동작하는지 확인하자.
태그
📨 박주니에게 한마디
스팸·악성 메시지 방지를 위해 구글 로그인 후 메시지를 보낼 수 있어요. 비공개로 전달되며, 운영자 외에는 볼 수 없습니다.
Google 로그인 후 메시지 남기기