[Linux] Apache Virtualhost로 도메인 여러개 서비스하기

반응형
반응형

 

Virtual Host(가상 호스트)는 하나의 서버에서 여러 웹사이트를 서비스함을 의미합니다.

 

 

예를 들어, 서버에 a.tistory.com 웹서비스를 하고 있는데. 서비스가 완전히 다른 b.tistory.com 웹서버를 추가로 운영이  필요하다고 가정해 보자.

서버도 한대고, IP도 하나입니다.

두 도메인은 같은 IP로 설정되어 있는데, 각각의 도메인으로 접속을 했을 때 어떻게 다른 화면을 보여줄까? 이럴 때,  Virtual Host 사용하면 손쉽게 구성을 할 수 있습니다.

 

 

그럼, 예제를 한 번 구성해 보겠습니다.

 


실습 환경은 아래와 같습니다.

CentOS 7.8 - (IP : 192.168.56.102)
방화벽(iptables)  - OFF
SELINUX - Disabled
Apache/2.4.6 

 

/etc/httpd/conf.d/ 경로로 이동합니다.

[root@linux-2 /]# cd /etc/httpd/conf.d/
/etc/httpd/conf.d

 

vhost.conf 파일을 생성하고 아래 설정 내용을 입력 후 저장합니다.

각 사이트에 대한 virtualhost를 설정입니다.

<VirtualHost *:80>   
        ServerName a.tistory.com       # 도메인네임
        DocumentRoot /home/www/doc_1   # 루트 디렉토리(=소스파일 위치)
</VirtualHost>

<VirtualHost *:80>
        ServerName b.tistory.com
        DocumentRoot /home/www/doc_2
</VirtualHost>

 

위 설정에 맞게 DocumentRoot를 생성하고 각 경로에 index.html 파일을 만들어 줍니다.

파일 내용은 도메인 주소로 하겠습니다.

[root@linux-2 conf.d]# mkdir /home/www
[root@linux-2 conf.d]# mkdir /home1/www/doc_1
[root@linux-2 conf.d]# mkdir /home1/www/doc_2
[root@linux-2 conf.d]# echo "a.tistory.com" > /home/www/doc_1/index.html
[root@linux-2 conf.d]# echo "b.tistory.com" > /home/www/doc_2/index.html

 

Apache 재구동

[root@linux-2 doc_1]# systemctl restart httpd


설정한 페이지에 접근하기 전에 hosts 설정을 먼저 해주어야 합니다

(이미 도메인에 대한 DNS등록이 되어 있으신 분은 그냥 넘어가셔도 됩니다)

 

윈도우 hosts 파일의 위치는 다음과 같습니다. 찾아서 열어주시고

C:\Windows\System32\drivers\etc\hosts


맨 아래 부분에 아래 두줄을 추가하고 저장했습니다.

여기서 192.168.56.102는 리눅스 서버 IP입니다, 각자 환경에 맞게 입력하시면 됩니다.

192.168.56.102	a.tistory.com
192.168.56.102	b.tistory.com


이제 사이트를 한번 접속해 보겠습니다.

 

음... 예상과 달리 설정한 페이지가 안 뜨고 Apache 기본 페이지가 뜨네요.

 

서버에서 로그를 한번 보겠습니다

 

access_log

- 403 forbidden 에러가 뜨네요,  권한 관련 문제일 가능성이 높겠네요.

[root@linux-2 conf.d]# tail -f /var/log/httpd/access_log
192.168.56.1 - - [29/May/2020:23:12:26 +0900] "GET / HTTP/1.1" 403 4897 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

error_log

- 원인이 명확하게 나오네요 "client denied by server configuration: /home/www/doc_1/"

- 루트 디렉터리에 접근이 거부되었습니다.

[root@linux-2 conf.d]# tail -f /var/log/httpd/error_log
[Fri May 29 23:19:29.615562 2020] [authz_core:error] [pid 2190] [client 192.168.56.1:52137] AH01630: client denied by server configuration: /home/www/doc_1/

 

 

루트 디렉토리에 접근하기 위해서는 <Directory> 태그에 설정을 해주어야 합니다

 

Apache 설정 파일에 아래 <Directory> 태그 설정 입력 및 저장  

/etc/httpd/conf.d/http.conf

 

<Directory "/home/www/doc_1">
    Require all granted
</Directory>

<Directory "/home/www/doc_2">
    Require all granted
</Directory>

 

서비스를 재구동 합니다.

[root@linux-2 doc_1]# systemctl restart httpd

 

 

다시 웹서버 접속

a.tistory.com로 접속하면 화면에 "a.tistory.com" 이 출력되는 것을 확인하실 수 있고 

반대로, b.tistory.com로 접속하면 화면에 "b.tistory.com" 이 출력되는 것을 확인하실 수 있습니다

 

 

 

접근하는 과정에 대해 잠간 확인해 보겠습니다

▶ a.tistory.com 도메인을 브라우저에 입력

▶ dns 서버에서 a.tistory.com 도메인에 대한 192.168.56.102 IP주소를 받아옵니다(본문에서는 호스트 파일을 이용함)

▶ 192.168.56.102 주소로 접근합니다

▶  "<VirtualHost *:80>"에  *표로,  서버에 할당된 어느 IP로 들어오던지 상관없이 모든  VirtualHost든 접근이 가능한 상태입니다.

▶ 그럼 요청은 어떻게 첫번쨰 VirtualHost로 접근이 될까요?

    클라이언트는 요청시 "HOST" 헤더에 a.tistory.com 도메인 정보를 같이 보냅니다.

    그래서, 서버는 HOST정보를 보고 원하는 적합한 VirtualHost로 연결을 지원하게 됩니다.

▶ 마지막으로, 서버는 요청 도메인에 해당하는 index.html 파일을 서비스합니다.

 

 

그럼 실제 "HOST" 헤더 값을 한 번 확인해 보겠습니다.

브라우저에서 a.tistory.com 에 접속한 상태에서,

크롭 개발자도구(F12)를 열어서 Network -> Headers로 들어가시면  "HOST" 값을 확인하실 수 있습니다.

 

 

반응형

댓글

Designed by JB FACTORY

loading