하나의 서버에서 복수의 웹 사이트를 생성하고 운영할 수 있을까? 아파치 웹 서버의 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개 웹 사이트를 운영하고 있다.
https://www.eqmaker.kr: 개인 블로그https://www.decteng.com: 미디어 기술 블로그https://www.eqmaker.kr/battery/: 아빠의 배터리 용량 테스트
아파치 웹 서버에서 가상 호스트를 구성하는 절차
아파치에서 가상 호스트를 구성하는 절차는 아래의 큰 흐름을 따라 진행하면 된다.
- 사이트의 도메인 DNS 등록
- 웹 사이트의 홈 디렉토리를 생성
- 아파치 가상 호스트 설정 파일 작성
- 설정을 적용 후 웹 서버 재시작
본 글에서는 데비안 리눅스 시스템에서 sudo apt install apache2 명령어를 이용해 아파치를 설치한 환경을 기준으로, www.blogdemo1.kr와 www.blogdemo2.kr라는 가상의 웹 페이지를 하나의 아파치 서버에 구성하는 절차를 설명한다. 다른 OS라고 할지라도 아파치를 사용하고 있다면 거의 동일한 방법으로 구성할 수 있다.
사전 준비
- 도메인
사용할 도메인을 구매하거나 서브도메인을 추가로 생성해 DNS에 등록해 주고 도메인과 연결될 웹 서버의 IP 주소를 등록해 준다. 이에 대한 내용은 각 도메인 제공 업체에서 확인해야 한다.
- 홈 디렉토리 생성
각 웹 사이트가 사용할 홈 디렉토리를 생성한다. 아파치 웹 서버의 기본 홈 디렉토리는 보통
/var/www/html이지만, 여러 사이트를 운영할 때는 사이트별로 별도의 디렉토리를 만들어 관리하는 것이 좋다. 여기에서는 편의상/var/www/아래에blogdemo1과blogdemo2라는 이름의 디렉토리를 생성한다.eqmaker@debian:~$ cd /var/www/ eqmaker@debian:/var/www$ mkdir blogdemo1 eqmaker@debian:/var/www$ mkdir blogdemo2 - 테스트용 index.html 생성
각 디렉토리에
index.html파일을 생성해 준다. 이 파일은 웹 서버가 정상적으로 동작하는지 확인하는 데 필요하다.nano같은 에디터나, 아래의 예처럼 콘솔 명령을 사용해도 무방하다.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.conf 와 blogdemo2.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>
가상 호스트 설정의 각 항목은 다음과 같은 의미를 가지고 있다.
ServerName- 아파치가 가상 호스트를 구분할 때 사용하는 기본 이름.
DocumentRoot에 설정된 경로를 웹 루트로 처리한다. ServerAlias- 사이트 도메인 별칭이다. 위의
ServerName와 같은 역할이며,blogdemo1.kr과www.blogdemo1.kr를 동시에 처리하게 한다. DocumentRoot- 웹 사이트 파일이 저장된 웹 루트 디렉토리 경로
Directory- 해당 디렉토리의 접근 권한에 대한 설정
ErrorLog- 웹 사이트의 에러 로그를 저장할 경로와 로그 파일 이름
CustomLog- 웹 사이트의 접속 로그를 저장할 경로와 로그 파일 이름
설정의 적용과 확인
- 가상 호스트 활성화
설정 파일을 작성했다면 아파치에 설정 파일을 적용시켜 주어야 한다. 다음과 같이 생성한 가상 호스트 파일을 활성화시켜 주고 불필요한 기본 사이트를 비활성화 해준다.
sudo a2ensite blogdemo1.kr.conf sudo a2ensite blogdemo2.kr.conf sudo a2dissite 000-default.conf - 설정 파일 검증
아파치의 설정 파일에 문제가 없는지 확인해 본다. 문제가 없을 경우, 아래와 같이 Syntax OK메시지가 나타난다.
eqmaker@debian:~$ sudo apache2ctl configtest Syntax OK eqmaker@debian:~$ - 아파치 재시작
sudo systemctl restart apache2명령을 이용해 아파치 데몬을 재시작 한다.
마지막으로 웹 브라우저에서 두 사이트의 주소를 각각 입력해 주면, 미리 저장해 둔 각 사이트의 index.html파일의 내용이 표시된다.
HTTPS 적용에 대한 참고
현대 웹 사이트에서는 대부분 HTTP보다 HTTPS 연결을 기본으로 사용한다. 아파치에서는 TCP 80번 포트를 사용하는 HTTP와 TCP 443번 포트를 사용하는 HTTPS를 별도의 가상 호스트로 설정한다. 즉, 같은 웹 문서 디렉토리를 사용하더라도 HTTP용 가상 호스트와 HTTPS용 가상 호스트는 서로 분리되어 관리된다.
HTTPS 사이트를 구성하려면 TCP 443번 포트에 대한 가상 호스트 설정과 함께 SSL/TLS 인증서를 지정해야 한다. 기본적인 ServerName, ServerAlias, DocumentRoot 설정은 HTTP 가상 호스트와 비슷하지만, 인증서 파일 경로와 SSL 관련 설정이 추가된다는 점이 다르다.
또한 인증서는 도메인 이름을 기준으로 발급된다. 따라서 blogdemo1.kr와 blogdemo2.kr를 각각 운영한다면, 각 도메인에 대해 인증서를 따로 발급받거나 두 도메인을 모두 포함하는 하나의 인증서를 사용해야 한다. www.blogdemo1.kr처럼 www가 붙은 주소도 별도의 도메인 이름으로 취급되므로, 실제 운영 시에는 사용할 모든 도메인 이름이 인증서에 포함되어 있는지 확인해야 한다.
FAQ
- 브라우저로 접속했는데
403 Forbidden에러 화면이 뜨는 이유는? 403 Forbidden에러는 웹 루트 디렉토리에 접근할 권한이 없을 때 발생하는 대표적인 오류이다. 웹 루트 디렉토리의 권한이 올바른지 확인해야 하며, 외부 방문자가 읽을 수 있도록 디렉토리 권한을755로 설정하거나, 가상 호스트 설정 파일 내부에Require all granted설정이 빠져 있는지 확인해야 한다.apache2ctl configtest실행 결과Syntax OK는 뜨는데 도메인 관련 경고가 함께 표시되는 이유는?Could not reliably determine the server's fully qualified domain name경고는 아파치 서버의 전체 기본 도메인, 즉Global ServerName이 지정되지 않았을 때 나타나는 안내 문구이다.Syntax OK가 함께 표시되었다면 가상 호스트 설정 자체의 문법 오류는 아니므로, 실습 단계에서는 무시해도 무방하다.www가 붙은 주소와 붙지 않은 주소는 서로 다른 사이트인가?- 기술적으로는 서로 다른 도메인 이름으로 취급된다. 따라서
blogdemo1.kr와www.blogdemo1.kr를 같은 사이트로 사용하려면 아파치 웹 서버의ServerAlias설정에 함께 등록해야 한다.HTTPS를 사용할 경우 SSL/TLS 인증서에도 두 도메인 이름이 모두 포함되어 있어야 한다. sites-available과sites-enabled는 무엇이 다른가?sites-available은 작성된 가상 호스트 설정 파일들이 저장되는 디렉토리이고,sites-enabled는 실제로 활성화되어 아파치가 읽어들이는 설정 파일 링크가 저장되는 디렉토리이다. 일반적으로a2ensite명령을 사용하면sites-available의 설정 파일이sites-enabled에 연결된다.HTTPS를 사용하려면 어떻게 해야 하는가?HTTPS를 사용하려면 TCP 443번 포트에 대한 가상 호스트 설정과 SSL/TLS 인증서가 필요하다. 개인 서버 환경에서는Let's Encrypt와 같은 무료 인증서 발급 도구를 많이 사용하며, 이러한 도구를 이용하면 인증서 발급과 함께HTTPS용 가상 호스트 설정을 생성하거나 기존 설정에 SSL 관련 항목을 추가할 수 있다.- 하나의 아파치 서버에서 만들 수 있는 가상 호스트의 최대 개수는?
- 아파치 웹 서버에는 일반적인 운영 환경에서 체감할 만한 가상 호스트 개수의 고정 제한은 없다. 수십 개 또는 수백 개의 가상 호스트를 구성하는 것도 가능하다. 다만 실제 운영 가능한 개수는 서버의 CPU, 메모리, 디스크 I/O, 네트워크 트래픽, 로그 처리, SSL/TLS 인증서 관리 방식, 각 웹 사이트의 접속량에 따라 달라진다.
갱신 내역
- — 최초 게시
- — 수정