본문으로 바로가기

우분투 Apache의 VirtualHost(가상호스트)의 일례를 소개합니다. 이 글은 DigitalOcean에 소개된 내용을 토대로 몇가지 살을 붙여 작성하였습니다.

VirtualHost(가상호스트)를 사용하는 방법에는 세가지 방법이 있으나 그 중에서 NameVirtualHost (이름기반 가상호스트)를 많이 사용한다. 우분투에서도 기본값으로 이름기반 가상호스트에 대한 설정이 되어 있다.

이름기반 가상호스트를 사용하게 됨으로써, 주호스트가 사라지게 되는데 우분투의 아파치 설정파일인 /etc/apache2/apache2.conf에 ServerName이나 DocumentRoot가 지정되어 있지 않은 이유가 이때문이다.

이름기반 호스트를 사용하게 되면 가장 첫번째로 등장하는 가상호스트설정을 주호스트로 인식하게되고 우분투에서는 이 가상호스트가 /etc/apache2/sites-available/default 파일이다. 그러므로 이 파일에 지정되어 있는 ServerName과 DocumentRoot 지시자가 주호스트를 가리키게 되므로 기존에 사용하던 주호스트가 있다면 이 파일에 그 내용을 작성하면 된다. 이 파일은 또한 요청된 적절한 가상호스트를 찾지 못하게 되면 대신 보여주게될 페이지 작성의 용도로도 사용된다.

1.VirtualHost용 디렉토리 생성

아파치의 가상호스트로 사용할 디렉토리를 생성한다.

# example.com이라는 도메인 이름으로 디렉토리 생성
sudo mkdir -p /var/www/example.com/public_html

# log들이 저장될 디렉토리를 생성
sudo mkdir /var/www/example.com/logs

2.디렉토리 권한 변경

가상호스트의 파일들이 들어갈 public_html 의 소유권한을 사용자ID와 사용자그룹으로 변경한다. $USER에 가상호스트를 사용할 사용자ID와 사용자그룹으로 변경하면 된다.

sudo chown -R $USER.$USER /var/www/example.com/public_html

누구나 접근해서 읽을수 있게 접근권한을 변경한다.

sudo chmod -R 755 /var/www

3.인덱스 파일 생성

사이트 확인을 위해서 index.html 파일을 생성한다.

sudo vi /var/www/example.com/public_html/index.html

  <html>
  <body>
    <h1>Hellow, World!</h1>
    <h2>Here is example.com</h2>
  </body>
  </html>

4.VirtualHost 파일 생성

우분투에서 기본값으로 제공하는 가상호스트 파일을 복사한다.

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/example.com

5.VirtualHost 설정

가상호스트 파일을 수정하기 위해 파일을 연다.

sudo vi /etc/apache2/sites-available/example.com

ServerAdmin 에 에러발생시 이메일 연락처 등록

ServerAdmin webmaster@example.com

ServerName 이 누락되어 있는데 이 곳에 가상호스트에서 사용할 도메인명 입력

ServerName example.com

ServerAlias 는 별칭, www.example.com 으로 접속해도 example.com 으로 접속된다(네임서버에 관련사항이 등록되어 있어야 한다).

ServerAlias www.example.com

DocumentRoot 는 가상호스트로 사용될 주소입력

DocumentRoot /var/www/example.com/public_html

찾는 문서가 없을경우 보여지게 될 에러문서를 직접 정할 수도 있다.

ErrorDocument 404 /404.html

디렉토리 지시자중에 /var/www 에 대한 내용을 사용할 가상호스트 디렉토리 주소로 변경

Options 값중에 Indexes 제거(이 값이 존재하면 가상호스트로 사용될 주소의 파일이 리스팅되어 보안상 위험하다).

AllowOverride 는 워드프레스처럼 .htaccess 파일을 사용하는 경우 값을 All로 변경

<Directory /var/www/example.com/public_html>
  Options FollowSymLinks
  AllowOverride All
  Order allow,deny
  allow from all 
</Directory>

로그가 작성될 위치를 지정한다(이를 따로 분리하지 않으면 /var/log/apache2 디렉토리 이하에 모든 가상호스트의 로그가 기록되니 분리하도록 한다).

ErrorLog /var/www/example.com/logs/error.log
CustomLog /var/www/example.com/logs/access.log combined

VirtualHost 활성화

생성하고 수정한 파일을 등록한다.

sudo a2ensite example.com
sudo service apache2 restart

가상호스트 default

DNS에 등록되지 않은 주소의 사이트는 각각의 브라우저에서 제공하는 '찾을 수 없는 페이지'를 보여주게 된다. DNS에 등록되어 있으나 이 페이지를 찾을 수 없는 경우 default 설정에 따른다(나의 경우 아파치에서 기본적으로 제공해 주고 있는 default 설정파일을 복사해두고, default 파일을 수정해서 사용한다).

sudo vi /etc/apache2/sites-available/default

<VirtualHost _default_:80>
...

  <Directory /var/www/>
    Options에서 Indexes제거
  </Directory>


  # 에러로그를 남기지 않음
  ErrorLog /dev/null    

  # 주석처리하여 access 로그를 남기지 않음
  # CustomLog   ...    
...
</VirtualHost>

TroubleShooting

우분투의 Apache2 에 대한 기본설정이 이름기반 가상호스트를 염두에 두고 작성되어 있다. 그런 연유로 아파치를 재시작하다보면 아래와 같은 에러메세지를 볼 수 있다.

apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

이 에러메시지가 거슬린다면 /etc/apache2/httpd.conf 에 적당한 NameServer 값을 입력하면 된다. /etc/apache2/sites-available/default 파일을 사용할 것이라면 ServerName을 같은 값으로 지정하는것도 좋다.