리버스 프록시란?
클라이언트 대신 백엔드 서버로 요청을 전달하고, 그 응답을 다시 클라이언트에게 반환해주는 서버
보안성 및 분산 처리에 유리함 !!
실습 구조
[ 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 |