[Docker / NginX] 하나의 Domain으로 여러 개의 웹사이트 운영
Docker와 Nginx로 멀티 사이트 운영하기
여러 개의 웹사이트를 운영해야 하는데, 도메인은 하나만 가지고 있다면?
걱정 마세요! Docker와 Nginx를 사용하면 하나의 도메인으로 여러 웹사이트를 효율적으로 운영할 수 있습니다.
이 글에서는 Docker와 Nginx를 활용하여 멀티 사이트를 구축하는 방법을 자세히 알아보겠습니다.
1. 왜 Docker와 Nginx를 사용해야 할까요?
Docker와 Nginx는 멀티 사이트 운영에 최적화된 조합입니다. 각각의 장점을 살펴보겠습니다.
- Docker: 애플리케이션을 컨테이너로 격리하여 실행 환경을 일관성 있게 유지합니다.
- Nginx: 고성능 웹 서버이자 리버스 프록시로, 트래픽을 효율적으로 분산하고 SSL/TLS 암호화를 처리합니다.
Docker를 사용하면 각 웹사이트를 독립적인 컨테이너에서 실행할 수 있으며, Nginx는 이러한 컨테이너로 트래픽을 라우팅하여 하나의 도메인으로 여러 웹사이트를 서비스할 수 있도록 합니다.
2. Docker 환경 설정
먼저 Docker 환경을 설정해야 합니다. Docker가 설치되어 있지 않다면, Docker 공식 웹사이트에서 설치 가이드를 참조하여 설치하세요.
2.1. 웹사이트 컨테이너 생성 (예시: 두 개의 웹사이트)
각 웹사이트를 위한 Docker 컨테이너를 생성합니다. 여기서는 간단한 HTML 파일을 제공하는 두 개의 웹사이트를 예시로 사용합니다.
웹사이트 1 (site1):
# site1/index.html
<!DOCTYPE html>
<html>
<head>
<title>Site 1</title>
</head>
<body>
<h1>Welcome to Site 1</h1>
</body>
</html>
웹사이트 2 (site2):
# site2/index.html
<!DOCTYPE html>
<html>
<head>
<title>Site 2</title>
</head>
<body>
<h1>Welcome to Site 2</h1>
</body>
</html>
각 웹사이트의 Dockerfile을 작성합니다. 각 웹사이트의 루트 디렉토리에 Dockerfile을 생성합니다.
site1/Dockerfile:
FROM nginx:latest
COPY index.html /usr/share/nginx/html
site2/Dockerfile:
FROM nginx:latest
COPY index.html /usr/share/nginx/html
각 Dockerfile을 빌드하여 이미지를 생성합니다.
docker build -t site1 . # site1 디렉토리에서 실행
docker build -t site2 . # site2 디렉토리에서 실행
생성된 이미지를 기반으로 컨테이너를 실행합니다.
docker run -d --name site1_container -p 8001:80 site1
docker run -d --name site2_container -p 8002:80 site2
3. Nginx 설정: 리버스 프록시 및 가상 호스트
Nginx 설정을 통해 각 웹사이트로 트래픽을 라우팅합니다. Nginx 컨테이너를 생성하고, 설정 파일을 작성합니다.
3.1. Nginx 컨테이너 생성
Nginx 컨테이너를 위한 Dockerfile을 작성합니다.
# nginx/Dockerfile
FROM nginx:latest
COPY nginx.conf /etc/nginx/conf.d/default.conf
Nginx 설정을 위한 파일을 생성합니다.
# nginx/nginx.conf
server {
listen 80;
server_name yourdomain.com; # 실제 도메인으로 변경
location / {
proxy_pass http://site1_container:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /site2/ {
proxy_pass http://site2_container:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Dockerfile을 빌드하고 컨테이너를 실행합니다.
docker build -t nginx . # nginx 디렉토리에서 실행
docker run -d --name nginx_container -p 80:80 --network host nginx
위 설정에서 yourdomain.com을 실제 도메인으로 변경하고, /site2/와 같은 경로를 사용하여 두 번째 웹사이트에 접근하도록 설정했습니다. proxy_pass는 트래픽을 해당 컨테이너로 전달합니다.
4. DNS 설정
도메인 DNS 설정을 통해 Nginx 컨테이너의 IP 주소를 가리키도록 설정합니다. 도메인 등록 기관에서 A 레코드를 추가하여 Nginx 컨테이너가 실행되는 서버의 IP 주소를 지정합니다.
5. SSL/TLS 설정 (HTTPS)
보안을 위해 SSL/TLS를 설정하여 HTTPS를 사용합니다. Let's Encrypt와 같은 서비스를 사용하여 SSL 인증서를 발급받고, Nginx 설정에 추가합니다.
Nginx 설정 (HTTPS):
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
location / {
proxy_pass http://site1_container:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /site2/ {
proxy_pass http://site2_container:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6. 배포 및 관리 팁
- Docker Compose: Docker Compose를 사용하여 여러 컨테이너를 쉽게 관리하고 배포할 수 있습니다.
- 자동화: CI/CD 파이프라인을 구축하여 자동 배포를 구현합니다.
- 모니터링: Prometheus와 Grafana를 사용하여 컨테이너 및 서버의 성능을 모니터링합니다.
- 로그 관리: ELK 스택(Elasticsearch, Logstash, Kibana) 또는 Fluentd를 사용하여 로그를 수집하고 분석합니다.
7. 결론
Docker와 Nginx를 활용하면 하나의 도메인으로 여러 웹사이트를 효율적으로 운영할 수 있습니다.
이 가이드를 통해 멀티 사이트 구축의 기본을 이해하고, 실제 환경에 적용해 보세요.
Docker의 유연성과 Nginx의 강력한 성능을 통해 웹사이트 운영의 효율성을 높일 수 있습니다.