Docker를 이용한 간단한 리버스 프록시 Path-based Routing 실습 (+ nginx, docker-compose)

2025. 5. 19. 16:06·DevOps

리버스 프록시란?


리버스 프록시 아키텍쳐 다이어그램 (출처- wiki)

클라이언트 대신 백엔드 서버로 요청을 전달하고, 그 응답을 다시 클라이언트에게 반환해주는 서버
보안성 및 분산 처리에 유리함 !!

실습 구조


[ Client ] ──▶ [ NGINX (리버스 프록시) ] ──▶ [ API Server (Node.js) ]
                                       └─▶ [ Web Server (HTML) ]

nginx 서버 및 api, web 서버는 실습상 편의를 위해 모두 docker 컨테이너를 이용

특징


  • nginx가 클라이언트를 대신해 요청
  • 클라이언트는 백엔드 서버를 몰라도 됨
  • nginx가 요청 흐름을 제어 (다양한 경로, 다양한 서버로 요청을 나누어 전송 가능)
  • 응답도 nginx가 전달 (클라이언트는 응답이 어디서 왔는지 알 수 없음.)

실습


실습 폴더 디렉토리 구성

.
├── api-server
│   ├── Dockerfile
│   └── server.js
├── docker-compose.yml
├── nginx
│   └── nginx.conf
└── web-server
    ├── Dockerfile
    └── index.html

docker-compose.yml 작성

version: '3'
services:
  nginx: # 리버스 프록시 역할을 하는 Nginx 컨테이너
    image: nginx:latest
    ports:
      - "8080:80" # 호스트의 8080 포트를 컨테이너의 80번 포트에 연결 (브라우저에서 http://localhost:8080 접속 가능)
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 사용자 정의 Nginx 설정 파일을 컨테이너 내부 설정 위치에 마운트
    depends_on:
      - api # api 서비스가 먼저 시작된 후 nginx가 시작됨
      - web # web 서비스가 먼저 시작된 후 nginx가 시작됨

  api: # 백엔드 API 서버
    build: ./api-server # ./api-server 디렉터리의 Dockerfile을 빌드하여 이미지 생성
    container_name: api-server

  web: # 정적 웹 서버
    build: ./web-server # ./web-server 디렉터리의 Dockerfile을 빌드하여 이미지 생성
    container_name: web-server

nginx/nginx.conf 작성 (nginx 설정파일)

events {}

http {
  upstream api_backend {
    server api:3000;
    # 'api'는 docker-compose에서 정의된 서비스 이름 (DNS라고 생각하면됨!!)
    # 포트 3000은 api 서버가 애플리케이션을 실행 중인 포트
    # 여러 서버를 나열하면 로드밸런싱됨
  }

  upstream web_backend {
    server web:80;
    # 'web'은 docker-compose에서 정의된 웹 서버 컨테이너 이름 (DNS라고 생각하면됨!!)
    # 기본 Nginx 웹서버 포트 80 사용 (이번 실습에서 웹서버는 nginx를 이용해서 띄웠기 때문!!)
  }

  server {
    listen 80;

    location /api/ {
      proxy_pass http://api_backend/;
      # /api/로 시작하는 요청을 upstream 'api_backend'로 전달
      # proxy_pass에 끝 슬래시 '/'가 있으므로, /api/는 제거되고 전달됨
      # 예: /api/hello → http://api_backend/hello (http://api:3000/hello)
    }

    location /web/ {
      proxy_pass http://web_backend/;
      # /web/로 시작하는 요청을 upstream 'web_backend'로 전달
      # /web/ 경로는 제거되고 전달됨
      # 예: /web/index.html → http://web_backend/index.html (http://web:80/index.html)
    }
  }
}

api-server


api-server/Dockerfile 작성

FROM node:18
WORKDIR /app
COPY server.js .
RUN npm install express
CMD ["node", "server.js"]

api-server/server.js 작성

nginx를 중심으로 하는 실습이기 때문에 api 서버는 간단히 node.js를 이용하였습니다.

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from API server!');
});

app.listen(port, () => {
  console.log(`API server listening on port ${port}`);
});

web-server


web-server/Dockerfile 작성

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html

web-server/index.html 작성

<!DOCTYPE html>
<html>
<head><title>Web Server</title></head>
<body>
  <h1>Hello from Web Server!</h1>
</body>
</html>

실습 결과


api 서버로 요청

client가 http://localhost:8080/api/ 요청 -> nginx -> http://api:3000 -> nginx -> client

web 서버로 요청

client가 http://localhost:8080/web/ 요청 -> nginx -> http://web:80 -> nginx -> client

'DevOps' 카테고리의 다른 글

Kubernetes 기반 NGINX 리버스 프록시와 HPA를 이용한 API 서버 자동 확장 (+부하테스트)  (1) 2025.05.22
Github Actions + Docker + EC2 로 테트리스 게임 배포하기  (0) 2025.04.01
컨테이너 인프라 환경  (0) 2025.01.24
'DevOps' 카테고리의 다른 글
  • Kubernetes 기반 NGINX 리버스 프록시와 HPA를 이용한 API 서버 자동 확장 (+부하테스트)
  • Github Actions + Docker + EC2 로 테트리스 게임 배포하기
  • 컨테이너 인프라 환경
devStudent
devStudent
저의 개발(Development) 공부(Study) 기록을 추적(Tracing) 하는 블로그입니다!
  • devStudent
    Dev_Study_Trace
    devStudent
  • 전체
    오늘
    어제
    • 분류 전체보기 (23)
      • BackEnd (11)
      • DevOps (4)
      • Algorithm (7)
      • DDD 12기 (Server) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    쿠버네티스
    boj1068
    Divide and conquer
    알고리즘
    백준 1068번
    백준
    리버스 프록시
    NGINX
    백준 1092
    yml
    프록시 실습
    분할 정복 알고리즘
    boj
    GitHub Actions
    http 상태코드
    devops
    데브 옵스
    도커
    boj 1992
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devStudent
Docker를 이용한 간단한 리버스 프록시 Path-based Routing 실습 (+ nginx, docker-compose)
상단으로

티스토리툴바