+----------------+ +----------------+ +----------------+
| | | | | |
| 클라이언트 +------>+ 웹 서버 +------>+ 애플리케이션 +------>+ 데이터베이스 |
| (브라우저) | | (NGINX) | | 서버 | | (MySQL 등) |
| | | | | | | |
+----------------+ +----------------+ +----------------+ +----------------+
정적 파일 제공 비즈니스 로직 처리 데이터 저장/조회1. 프레젠테이션 계층 (웹 서버)
2. 애플리케이션 계층 (웹 애플리케이션 서버)
3. 데이터 계층 (데이터베이스 서버)
version: '3'
services:
# 웹 서버 (프레젠테이션 계층)
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./frontend:/usr/share/nginx/html
depends_on:
- backend
networks:
- frontend-network
# 애플리케이션 서버 (비즈니스 계층)
backend:
build: ./backend
environment:
- DB_HOST=database
- DB_USER=user
- DB_PASSWORD=password
- DB_NAME=myapp
expose:
- "8080"
depends_on:
- database
networks:
- frontend-network
- backend-network
# 데이터베이스 서버 (데이터 계층)
database:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=myapp
- MYSQL_USER=user
- MYSQL_PASSWORD=password
volumes:
- db-data:/var/lib/mysql
networks:
- backend-network
networks:
frontend-network:
backend-network:
volumes:
db-data:server {
listen 80;
server_name
example.com
;
# 정적 파일 제공
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
# API 요청을 백엔드로 프록시
location /api/ {
proxy_pass
http://backend:8080/
;
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;
}
}일반적으로 엔터프라이즈 웹 애플리케이션은 3가지 종류의 서버로 구성됩니다.
이 3가지 종류의 서버가 유기적으로 상호작용하면서 하나의 애플리케이션으로 구성되는 것을 3Tier 아키텍처라고 부릅니다.
이 3Tier 애플리케이션에서 가장 먼저 클라이언트의 첫번째 진입점 역할을 하는 서버가 바로 웹서버 입니다. 클라이언트가 주소창에 어떤 요청을 보냈을 때, 요청한 경로에 해당하는 HTML이나 JS 같은 정적 파일을 사용자에게 제공해줍니다.
정적 파일이라는 것은 어떤 사용자이든 간에 동일한 경로로 보낸 요청은 동일한 내용의 페이지를 제공한다는 것을 의미합니다.
사용자마다 다른 데이터를 제공하기 위해서는 프론트엔드에서 제공받은 파을을 활용해서 클라이언트가 다시 백엔드 애플리케이션으로 요청을 보내야 합니다.
그리고 백엔드 애플리케이션은 데이터베이서에 요청을 보내서 영속성이 필요한 데이터를 조회하고 저장할 수 있습니다.
이때, 보통 클라이언트에 http://127.0.0.0/api/user 와 같이 백엔드 서버가 그대로 노출되어 있는 것을 볼 수 있는데, 일반적으로 백엔드 애플리케이션은 사용자가 직접 접근하지 않도록 설정하는 것이 유리합니다.
백엔드 애플리케이션은 시스템과 실제 데이터에 밀접한 연관이 있기 때문에 보안에 특히 주의해야 하기 때문입니다.
그래서 보통 NGINX 의 Proxy 라는 기능을 활용해서 백엔드 애플리케이션의 접근을 제한합니다.
이를 통해 백엔드 애플리케이션에 대한 요청은 웹 서버를 통해서만 접근이 가능하며, 웹 서버는 클라이언트와 백엔드 애플리케이션의 다리역할을 하기 위해서 프록시라는 기술을 활용합니다.
💡 Proxy는 요청을 전달해준다는 의미이며,
Nginx의 프록시 기술을 활용하면 특정 경로(/api로 시작하는 경로)로 온 요청을 지정한 서버로 전달함으로서 보안 향상, 부하 관리 및 API 응답 캐싱을 활용할 수 있습니다.
이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗