[Linux] Apache Virtualhost로 도메인 여러개 서비스하기
- IT
- 2020. 5. 29.
Virtual Host(가상 호스트)는 하나의 서버에서 여러 웹사이트를 서비스함을 의미합니다.
예를 들어, 서버에 a.tistory.com 웹서비스를 하고 있는데. 서비스가 완전히 다른 b.tistory.com 웹서버를 추가로 운영이 필요하다고 가정해 보자.
서버도 한대고, IP도 하나입니다.
두 도메인은 같은 IP로 설정되어 있는데, 각각의 도메인으로 접속을 했을 때 어떻게 다른 화면을 보여줄까? 이럴 때, Virtual Host 사용하면 손쉽게 구성을 할 수 있습니다.
그럼, 예제를 한 번 구성해 보겠습니다.
실습 환경은 아래와 같습니다.
CentOS 7.8 - (IP : 192.168.56.102) |
/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" 값을 확인하실 수 있습니다.
'IT' 카테고리의 다른 글
[Linux] NFS 서버 구축 (0) | 2020.05.31 |
---|---|
[Linux] Apache(아파치) 로그 설정 (0) | 2020.05.30 |
[Linux] 리눅스(CentOS7) Apache(아파치) 웹서버 설치 (0) | 2020.05.28 |
[IT생활] 레오폴드(LEOPOLD) FC750R 키보드 청소 (0) | 2020.05.24 |
[Windows] VirtualBox로 windows server 2016 설치하기 (0) | 2020.05.22 |