☁️Infra

Nginx 설정 변경: /api/me/* 요청을 3001 포트로 격리하여 API 라우팅 최적화

Nginx 설정 변경으로 /api/me/* 요청을 3001 포트로 격리하여 API 라우팅을 최적화하고 서비스 격리를 강화하는 방법을 설명합니다.

📅 2026년 5월 28일·📖 5분 읽기·👁 9

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/ 로 시작하고 그 뒤에 어떤 문자열이 오든((.*)) 모두 잡아낸다. 그리고 $1proxy_pass 의 URL 뒤에 붙여서 원래 요청 경로의 나머지 부분을 그대로 전달하게 된다.

결과

  • /api/me/* 요청이 localhost:3001 포트로 성공적으로 격리되었다.
  • API 라우팅이 최적화되어 요청 처리가 더 효율적으로 이루어졌다.
  • 서비스 격리가 강화되어 특정 API의 장애가 다른 서비스에 미치는 영향을 최소화할 수 있게 되었다.

정리 — 같은 함정 안 빠지려면

  • [ ] Nginx location 블록의 경로 매칭 방식 (접두사 vs 정규 표현식)을 정확히 이해하자.
  • [ ] proxy_pass 와 함께 경로를 재작성해야 할 때는 rewrite 지시어나 정규 표현식 캡처 그룹($1)을 활용하는 것을 고려하자.
  • [ ] 특정 경로 패턴을 분리할 때는 location 블록의 순서와 우선순위도 중요하다.
  • [ ] 변경 후에는 반드시 다양한 경로로 테스트하여 예상대로 동작하는지 확인하자.

태그

#Nginx#API 라우팅#서버 설정#서비스 격리#Proxy Pass#Location Block#Nginx 최적화

📨 박주니에게 한마디

스팸·악성 메시지 방지를 위해 구글 로그인 후 메시지를 보낼 수 있어요. 비공개로 전달되며, 운영자 외에는 볼 수 없습니다.

Google 로그인 후 메시지 남기기