오래된 프로그래머의 요즘 이야기

그리고 소소한 일상들...

허니의 소소한 일상들이 켜켜이 쌓여가고......

Tech Story

[Docker / NginX] 하나의 Domain으로 여러 개의 웹사이트 운영

쭝허니 2025. 7. 2. 23:09

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의 강력한 성능을 통해 웹사이트 운영의 효율성을 높일 수 있습니다.