하나의 아파치 서버에서 여러 웹 사이트를 운영하는 방법 – 가상 호스트 설정

하나의 아파치 서버에서 여러 웹 사이트를 운영하는 방법 - 가상 호스트 설정 섬네일 이미지로, 의인화된 아파치 서버가 3개의 사이트를 손에 들고 저글링 하는 모습

하나의 서버에서 복수의 웹 사이트를 생성하고 운영할 수 있을까? 당연히 가능하다. 아파치 웹 서버의 sites-available 에 가상 호스트(Virtual Host) 구성 파일을 추가해 복수의 웹 사이트들을 하나의 물리적 서버에서 구동하도록 구성하는 전체 절차를 실제 예제와 함께 설명한다.

하나의 웹 사이트는 하나의 서버가 아니다.

Siteefy의 자료에 따르면 2026년 5월 말 현재, 전 세계에는 약 14억 개의 웹 사이트가 존재하며, 그 가운데 휴면 사이트를 제외하고도 약 2억 개의 사이트가 실제 운영 중이라고 한다. 하루 평균 약 54만 개의 사이트가 새로 등록되는데, 이는 1초에 평균 6개의 사이트가 새로 생성된다는 뜻이다.

웹 사이트를 운영하기 위해서는 웹 서버가 필요하다. 그렇다면 지금 이 순간에도 1초당 6대씩 새로운 서버 장비가 팔리고 있는 걸까? 전 세계에 최소 14억 대의 물리적인 컴퓨터 서버가 존재하고 있는 것일까? 당연히 정답은 아니오다. 하나의 서버에서 수많은 웹 사이트를 운영할 수 있는 가상 호스트라는 개념이 있기 때문이다.

아파치 웹 서버와 가상 호스트

PC의 웹 브라우저 주소창에 https://www.eqmaker.kr를 입력한다고 가정해 보자, 최종적으로 www.eqmaker.kr를 담당하는 서버에게 도착하는 메시지는 다음과 같을 것이다.

www.eqmaker.kr 웹 페이지를 내놔라!

서버는 설치되어 있는 여러 프로그램 중, 웹 페이지를 제공할 수 있는 프로그램을 찾고, 아파치(Apache)나 엔진엑스(Nginx) 같은 웹 서버 프로그램에 이 메시지를 전달해 준다.

이렇게 평화롭던 어느 날, www.eqmaker.kr 운영자는 이런 생각을 하게 된다.

하루에 10명도 접속하지 않는데, 이 서버를 좀 더 효율적으로 사용할 수 없을까? 남는 공간에 다른 사이트도 같이 올리면 좋을 텐데..

이와 같은 고민에서 출발해 탄생한 것이 가상 호스트(Virtual Host)라는 개념이다. 서버로 들어오는 요청 속에 포함된 접근하고 싶은 도메인 이름과 경로를 웹 서버가 구별하여, 하나의 서버 안에서 각각 다른 웹 사이트 디렉토리로 연결해 주는 기술이다.

널리 사용되는 웹 서버 프로그램 중 하나인 아파치 웹 서버(이하 아파치) 역시 가상 호스트 기능을 지원하고 있다. 이를 이용해 본 필자는, 집에 있는 물리 서버(QNAP HS-453DX) 한 대로 아래의 3개 웹 페이지를 운영하고 있다.

아파치 웹 서버 가상 호스트를 구성하는 절차

아파치에서 가상 호스트를 구성하는 절차는 아래의 큰 흐름을 따라 진행하면 된다.

  1. 사이트의 도메인 DNS 등록
  2. 운영할 웹 사이트의 홈 디렉토리를 생성
  3. 아파치 가상 호스트 설정 파일 작성
  4. 설정을 적용 후 웹 서버 재시작

본 글에서는 데비안 리눅스 시스템에서 sudo apt install apache2 명령어를 이용해 아파치를 설치한 표준 환경을 기준으로, www.blogdemo1.krwww.blogdemo2.kr라는 가상의 웹 페이지를 하나의 아파치에 구성하기 위한 절차를 설명한다. 다른 OS라고 할지라도 아파치를 사용하고 있다면 거의 동일한 방법으로 구성이 가능하다.

사전 준비

  1. 도메인

    사용할 도메인을 구매하거나 서브 도메인을 추가로 생성해 DNS에 등록해 주고 바라볼 웹 서버의 IP를 등록해 준다. 이에 대한 내용은 각 도메인 제공 업체에서 확인해야 한다.

  2. 홈 디렉토리 생성

    각 웹 사이트가 사용할 홈 디렉토리를 생성한다. 아파치 웹 서버의 기본 홈 디렉토리는 보통 /var/www/html이다. 해당 경로로 접근한 다음, 각 사이트의 홈 디렉토리를 생성해 준다. 아래의 예에서는 blogdemo1, blogdemo2라는 이름의 디렉토리를 생성해 주었고, 편의상 /var/www/를 사용한다.

    eqmaker@debian:~$ cd /var/www/
    eqmaker@debian:/var/www$ mkdir blogdemo1
    eqmaker@debian:/var/www$ mkdir blogdemo2
    
  3. 테스트용 index.html 생성

    각 디렉토리에 index.html 파일을 생성해 준다. 이 파일은 웹 서버가 정상적으로 동작하는지 확인하는 데 필요하다. nano같은 에디터나, 아래의 예처럼 tee같은 콘솔 명령을 사용해도 무방하다. 내용을 입력해 준 후, Ctrl+C를 눌러주면 저장된다.

    eqmaker@debian:/var/www$ cd blogdemo1
    eqmaker@debian:/var/www/blogdemo1$ tee index.html
    site1
    site1
    ^C
    eqmaker@debian:/var/www/blogdemo1$ ls -l
    total 4
    -rw-r--r-- 1 eqmaker eqmaker 6 May 27 17:26 index.html
    eqmaker@debian:/var/www/blogdemo1$ cat index.html
    site1
    eqmaker@debian:/var/www/blogdemo1$ 

    동일한 방법으로 blogdemo2 디렉토리에 index.html를 생성해 주고 내용은 site2라고 입력해 준다.

가상 호스트 설정 파일 생성

/etc/apache2/sites-available/ 에는 아파치의 호스트 관련 설정이 저장된다. 아무 것도 설정하지 않은 초기 상태라면 다음과 같은 기본 파일만 존재한다.

/etc/apache2/sites-available$ ls -l
total 28
-rw-r--r-- 1 root    root  1286 Sep 30  2024 000-default.conf

000-default.conf파일을 복사해 blogdemo1.kr.confblogdemo2.kr.conf 로 저장해 준다.

  • 첫 번째 사이트의 가상 호스트 파일 작성

    blogdemo1.kr.conf 의 내용을 아래의 내용으로 덮어쓴다.

    <VirtualHost *:80>
    ServerName blogdemo1.kr
    ServerAlias www.blogdemo1.kr
    DocumentRoot /var/www/blogdemo1
    
    	<Directory /var/www/blogdemo1>
    		AllowOverride All
    		Require all granted
    	</Directory>
    
    	ErrorLog ${APACHE_LOG_DIR}/blog1_error.log
    	CustomLog ${APACHE_LOG_DIR}/blog1_access.log combined
    </VirtualHost>
  • 두 번째 사이트의 가상 호스트 파일 작성

    blogdemo2.kr.conf 의 내용을 아래의 내용으로 덮어쓴다.

    <VirtualHost *:80>
    ServerName blogdemo2.kr
    ServerAlias www.blogdemo2.kr
    DocumentRoot /var/www/blogdemo2
    
    	<Directory /var/www/blogdemo2>
    		AllowOverride All
    		Require all granted
    	</Directory>
    
    	ErrorLog ${APACHE_LOG_DIR}/blog2_error.log
    	CustomLog ${APACHE_LOG_DIR}/blog2_access.log combined
    </VirtualHost>

최신 웹 서버는 http 대신 https 연결을 사용하는데, 아파치는 이 둘을 각각 다른 사이트로 취급한다. 본 글에서는 다중사이트 구성을 시험해 보는 것이 목적이기 때문에 http 사이트(TCP 포트 80번)만 다중 사이트를 구성했다.

가상 호스트 설정의 각 항목은 다음과 같은 의미를 가지고 있다.

ServerName
아파치가 가상 호스트를 구분할 때 사용하는 기본 이름. DocumentRoot에 설정된 경로를 웹 루트로 처리한다.
ServerAlias
사이트 도메인 별칭이다. 위의 ServerName와 같은 역할이며, blogdemo1.krwww.blogdemo1.kr 를 동시에 처리하게 한다.
DocumentRoot
웹 사이트 파일이 저장된 웹 루트 디렉토리 경로
Directory
해당 디렉토리의 접근 권한에 대한 설정
ErrorLog
웹 사이트의 에러 로그를 저장할 경로와 로그 파일 이름
CustomLog
웹 사이트의 특정 로그를 저장할 경로와 로그 파일 이름, combined를 설정한 경우, 정상 접속 기록도 함께 보관된다.

설정의 적용과 확인

  1. 가상 호스트 활성화

    설정 파일을 작성했다면 아파치에 설정 파일을 적용시켜 주어야 한다. 다음과 같이 생성한 가상 호스트 파일을 활성화시켜 주고 불필요한 기본 사이트를 비활성화 해준다.

    sudo a2ensite blogdemo1.kr.conf
    sudo a2ensite blogdemo2.kr.conf
    sudo a2dissite 000-default.conf
  2. 설정 파일 검증

    아파치의 설정 파일에 문제가 없는지 확인해 본다. 문제가 없을 경우, 아래와 같이 Syntax OK메시지가 나타난다.

    eqmaker@debian:~$ sudo apache2ctl configtest
    Syntax OK
    eqmaker@debian:~$
  3. 아파치 재시작

    sudo systemctl restart apache2명령을 이용해 아파치 데몬을 재시작 한다.

마지막으로 웹 브라우저에서 두 사이트의 주소를 각각 입력해 주면, 미리 저장해 둔 각 사이트의 index.html파일의 내용이 표시된다.

https 적용

본 글은 가상 호스트 활성화에 대한 글이다. 때문에 https 사용을 위한 인증서에 관해서는 간단하게만 짚고 넘어가겠다.

앞서 언급한 것처럼 현대의 웹 사이트는 대부분 https 연결을 기본으로 사용한다. 이를 위해서는 SSL/TLS 인증서가 필요하며, 개인 서버 환경에서는 공개 무료 인증서 서비스인 Let's Encrypt를 많이 사용한다.

이때 한 가지 주의할 것이 있다. 본래 인증서는 도메인 이름 단위로 발급된다. 즉, 서로 다른 두 개의 도메인을 운영하고 있다면 각 사이트별로 인증서를 따로 발급받아야 한다. 또한, blogdemo1.krwww.blogdemo1.kr 역시 서로 다른 주소로 취급된다.

때문에 하나의 인증서에 여러 도메인을 묶는 멀티 도메인(SAN) 방식이나, *.blogdemo1.kr처럼 모든 서브도메인을 한 번에 해결하는 와일드카드(Wildcard) 방식의 인증서가 널리 사용되고 있다.

FAQ

브라우저로 접속했는데 403 Forbidden 에러 화면이 뜨는 이유는?
403 에러는 홈 디렉터리에 접근할 권한이 없을 때 발생하는 대표적인 오류이다. 웹 루트 디렉토리의 권한이 올바른지 확인해야 한다. 외부 방문자가 읽을 수 있도록 디렉터리 권한을 ‘755’로 설정해 주거나, 설정 파일 내부의 Require all granted 설정이 빠져있는지 확인한다.
apache2ctl configtest 실행결과 Syntax OK는 뜨는데 도메인 관련 경고(Could not reliably determine the server’s fully qualified domain name)가 뜨는 이유는?
아파치 서버의 전체 기본 도메인(Global ServerName)이 지정되지 않아서 발생하는 안내 문구다. Syntax OK가 떴다면 가상 호스트 자체는 정상인 상황으로 무시해도 무방하다.
www가 붙은 주소와 붙지 않은 주소는 서로 다른 사이트인가?
기술적으로는 서로 다른 도메인 이름으로 취급된다. 따라서 아파치 웹 서버의 ServerAlias 설정이나 SSL 인증서 발급 시 함께 처리해 주어야 한다.
sites-available 과 sites-enabled 는 무엇이 다른가?
sites-available 은 저장된 가상 호스트 설정 파일들이 위치하는 곳이고, sites-enabled 는 실제로 활성화되어 Apache가 읽어들이는 설정 파일 링크가 저장되는 곳이다.
https를 사용하기 위한 방법은?
Let's Encrypt와 같은 인증서 발급 도구를 사용하면, 인증서 발급 진행시 https를 위한 가상 호스트 설정 파일이 자동으로 생성된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다