서버/Linux

우분투에서 아파치 가상호스트 (Virtual Host) 로, 한대의 서버에서 여러 웹서비스를...

날개 2013. 12. 22. 23:47

이번 포스트에서는 가상호스트(버추얼 호스트, Virtual Host)로 한대의 아파치 서버에서 여러 도메인으로 각각의 웹서비스를 하는 방법을 살펴 봅니다.


웹호스팅 서비스를 받으면서, 어떻게 하나의 서버에 수많은 사람들이 입주해서 각자의 도메인을 가지고 웹서비스를 할까 궁금한적이 없는지요?


아파치 웹서버에 기능 중 하나인 가상 호스트를 사용하면, 비슷하게 사용할 수 있습니다.


가상 호스트의 기능을 이용하면, 하나의 IP에 물려 있는 도메인들을 서버의 특정한 디렉터리에 매칭 시킬 수 있는데요, 필요에 따라 분리된 디렉터리를 유저들 각각에게 해당 디렉터리에만 접근 가능하도록 권한을 주고, MySQL과 같은 DBMS에도 특정 유저용 DB와 아이디 패스워드를 생성하면 일반적으로 알고 있는 웹호스팅 서비스의 구현이 가능한 것이죠.


여튼 여기서는 이 가상 호스트를 설정 하겠습니다. 이 방법을 사용하면 가상서버호스팅을 받는 경우 (또는 클라우드 서비스를 받는 경우) 하나의 가상 서버에서 여러개의 웹사이트를 운영할 수 있습니다. (단, 서비스 받는 업체의 약관을 잘 살펴보세요. 약관상 여러 도메인을 사용하지 못하게 하는 경우도 있을 수 있고, 사용할 수 있는 도메인 갯수를 정해 놓는 곳도 있습니다.)


물론, 본인이 직접 서버를 IDC나 전용선을 물려서 서비스하는 경우는 마음대로 해도 되겠지요.


그럼, 시작해 봅시다.


이 글에서는, minthandsgames.com 이라는 도메인을 기본 도메인으로 사용하고, www를 앞에 붙이는 경우도 인식할 수 있도록 설정 하겠습니다.


또한, 두번째 도메인으로 minthandsapps.com 이라는 도메인을 가상 호스트로 추가해 보겠습니다. 이 도메인 역시 www를 앞에 붙여도 인식 할 수 있도록 설정하겠습니다.


서버 OS는 리눅스 배포판의 하나인 우분투 12.04LTS를 사용하며, 웹서버로 아파치2를 사용합니다.



1. 연결할 도메인의 설정


연결할 도메인은 DNS가 해당하는 하나의 서버 IP를 가리도록 설정해야 합니다.

예를들어, 이 글에서는 minthandsgames.com 과 minthandsapps.com 둘 다 한 서버의 IP를 가리키도록 DNS를 설정합니다. (DNS 설정하는 것은 하나의 웹사이트를 운영하는 방법과 같으므로 생략)


또한, www를 앞에 붙여도 접속이 되게 하려면, 아래 설명하는 아파치 가상 호스트 설정 뿐 아니라, DNS에서 CNAME으로 www가 해당 도메인 IP를 가리키도록 해야 합니다.


두 도메인이 똑같은 IP (같은 서버)를 가리키게 해 놓아도, 아파치의 가상호스트 설정을 하면, 아파치가 해당 도메인을 설정한 디렉토리로 매칭시켜 줍니다.



2. 연결할 웹 디렉터리 생성


이 예제에서는 두개의 도메인을 구분해서 두개의 웹서비스를 할 것이기 때문에, 구분된 두개의 디렉터리를 만듭니다.


$ sudo mkdir -p /var/www/minthandsgames/html

$ sudo mkdir -p /var/www/minthandsgames/logs

$ sudo mkdir -p /var/www/minthandsapps/html

$ sudo mkdir -p /var/www/minthandsapps/logs


(참고로 -p 옵션은 하위 디렉터리까지 생성하라는 뜻입니다.)


html는 웹문서가 들어갈 디렉터리이고, logs는 에러로그등이 들어갈 디렉터리입니다.



3. 새로 만든 두개의 디렉터리에 권한 주기


리눅스(또는 유닉스)에서는 항상 권한에 신경을 써 줘야 합니다. 웹 디렉터리는 누구나 읽을 수 있어야 하므로 아래와 같이 새로 만든 두 개의 디렉터리에 읽고 실행할 수 있는 권한을 줍니다.


$ sudo chmod -R 755 /var/www


위와 같이 하면 두 디렉터리를 /var/www 하위에 두었으니 -R 옵션으로 하위 디렉터리인 새로 만든 디렉터리까지 같이 755권한(rwxr-xr-x)을 가지게 됩니다.


(참고로, 각 웹호스팅 서비스 처럼 각 웹서비스 별로 유저 소유권을 따로 주려면 chown을 사용하면 되겠죠.)



4. 샘플 페이지 만들기


가상호스트 설정 과정이 다 끝나고 테스트를 해 보려면, 각 디렉터리에 샘플 웹페이지가 있어야 겠죠? 간단하게 만들어 둡니다.


예를 들어 저는 아래와 같이 만들어 보겠습니다.


(1) var/www/minthandsgames/html 디렉터리에 index.html 파일을 아래와 같이 만듭니다.

<html>

<head>

<title>MintHands Games</title>

</head>

<body>

<h1>Welcome to the MintHands Games!</h1>

</body>

</html>


(2) var/www/minthandsapps/html 디렉터리에 index.html 파일을 아래와 같이 만듭니다.

<html>

<head>

<title>MintHands Apps</title>

</head>

<body>

<h1>Welcome to the MintHands Apps!</h1>

</body>

</html>



5. 가상 호스트 파일 만들기


이제 실질적인 아파치 설정에 들어가 봅니다.


우분투의 경우는 아파치2의 설정파일이 httpd.conf로 되어 있지 않고(있긴 있으나 비어있음) 세부적으로 나누어져 있습니다.


가상 호스트 파일은 보통 /etc/apache2/sites-available/ 디렉터리에 들어 있습니다. 이 디렉터리에 가상 호스트 파일을 만들어 두고, a2ensite 명령으로 /etc/apache2/sites-enabled/ 로 심볼릭링크를 만들어주어 사용되게 합니다.


그럼 가상 호스트 파일을 만들어 봅시다.


가상 호스트 파일은 /etc/apache2/sites-available/ 디렉터리에 있는 default 파일을 복사해서 수정하는 것이 쉽습니다.


먼저 가상 호스트 파일을 복사합니다.


$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/minthandsgames

$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/minthandsapps


복사한 파일을 이제 수정합니다.


먼저, minthandsgames 파일을 에디터로 열고 아래와 같이 추가하거나 수정합니다.

(빨간색 글자가 수정한 부분입니다. 적절하게 수정합니다. 녹색글자는 설명글이므로 입력하지 마세요.)


<VirtualHost *:80>

ServerAdmin webmaster@minthandsgames.com    (수정) 관리자 메일을 수정합니다.

ServerName minthandsgames.com              (추가) 가상 호스트용 도메인 이름을 지정해 줍니다

ServerAlias www.minthandsgames.com        (추가) www.minthandsgames.com 으로도 접속가능하도록

별명을 추가합니다.

DocumentRoot /var/www/minthandsgames/html    (수정) 웹문서 루트 디렉터리를 지정합니다.

<Directory />

Options FollowSymLinks

AllowOverride None

</Directory>

<Directory /var/www/minthandsgames/html>        (수정) 웹문서 디렉터리 옵션 지정을 위해 수정

Options Indexes FollowSymLinks MultiViews    (수정) 보안을 위해 Indexes를 삭제

AllowOverride All                                (수정) 아파치 내장 사용자 인증등을 위해 사용

Order allow,deny

allow from all

</Directory>


ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

<Directory "/usr/lib/cgi-bin">

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

</Directory>


ErrorLog /var/www/minthandsgames/logs/error.log    (수정) 에러로그가 들어갈 디렉터리 지정


# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn


CustomLog /var/www/minthandsgames/logs/access.log combined  (수정) 커스텀로그가 들어갈

디렉터리 지정

    Alias /doc/ "/usr/share/doc/"

    <Directory "/usr/share/doc/">

        Options Indexes MultiViews FollowSymLinks

        AllowOverride None

        Order deny,allow

        Deny from all

        Allow from 127.0.0.0/255.0.0.0 ::1/128

    </Directory>


</VirtualHost>


수정 완료 했으면, minthandsapps 파일도 위 파일 내용을 참조 하여 수정해 줍니다.


minthandsgames -> minthandsapps 로 수정하면 되겠지요.


수정이 완료 되었으면, 새로 만든 두 가상 호스트를 활성화 하기 위해 Enable 해줍니다.


$ sudo a2ensite minthandsgames

$ sudo a2ensite minthandsapps


아파치를 재시작 합니다.


$ sudo service apache2 restart


pache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName 이라는 경고가 나올 수 있는데, 크게 신경 쓰지 않아도 됩니다.


이제 웹브라우저로 제대로 나오는지 확인해 보면 됩니다.



( http://www.minthandsapps.com 으로 접속해 봤습니다.)


( http://www.minthandsapps.com 으로 접속해 보았습니다. )


두 사이트 모두 잘 나오는군요.


이런식으로 더 추가할 도메인과 가상 호스트가 필요하다면, 같은 방법으로 추가해 주면 됩니다.


(!) 참고 

이 글에서는 default 가상 호스트 파일을 복사해서 두 개의 가상 호스트를 만들어 보았습니다.

그런데, 두 가상 호스트의 디렉터리를 /var/www 밑에 두었지요. default 가상 호스트 파일을 보면 기본으로 이 디렉터리를 가리키고 있습니다. 

/var/www 가 기본 호스트라니 좀 찝찝할 수 있죠.

그러면 어떻게 해결 하면 될까요?

네. 간단하게 /var/www/default 와 같이 기본 호스트용 디렉터리를 하나 만들고, 지금까지 가상 호스트 설정한 것과 같은 방법으로 default 파일의 기본 호스트용 디렉터리 위치를 /var/www/default 로 수정해 주면 되겠네요.




끝.