가상 호스팅 🌈
가상 호스팅 🌈
가상 호스팅
가상 호스팅의 종류
- IP 기반 가상 호스팅(IP-Based Virtual Hosting)
- 이름 기반 가상 호스팅(Named-Based Virtual Hosting)
- 포트 기반 가상 호스팅(Port-Based Virtual Hosting)
가상 호스팅의 종류로는 3가지가 있다. 실무에서 제일 자주 사용하는 이름 기반 가상 호스팅에 대해 알아보자 😀
이름 기반 가상 호스팅(Named-Based Virtual Hosting)
- 하나의 IP 주소를 여러 개의 웹사이트가 공유하는 방식
- 클라이언트가 요청을 보낼 때 Host 헤더를 포함하면, 웹 서버는 이를 보고 어떤 사이트를 제공할지 결정
- 특징
- 하나의 IP 주소를 여러 개의 도메인이 공유함
- 클라이언트가 요청할 때 포함된 Host 헤더를 기준으로 어떤 웹 사이트를 제공할지 결정
- 대규모 웹 호스팅 서비스에서 주로 사용
- 장점
- IP 주소 절약
- 하나의 IP 주소로 여러 개의 웹사이트를 운영할 수 있음 → IPv4 주소 부족 문제 해결
- 추가적인 IP 주소를 구매할 필요가 없음 → 비용 절감
- 간편한 설정
- 웹 서버(Apache, Ngnix) 설정만으로 쉽게 적용 가능
- 별도의 네트워크 인터페이스 추가 없이 운영 가능
- 도메인 별 개별 운영 가능
example1.com,example2.com처럼 독립적인 사이트처럼 운영 가능- 각각의 도메인마다 개별 콘텐츠 및 SSL 적용 가능(단, 추가 설정 필요)
- 포트 80/443을 공유 가능
- 하나의 서버에서 동일한 포트(HTTP 80, HTTPS 443)를 여러 사이트가 공유 가능
- 별도 포트 할당 없이 사용 가능(IP 기반 가상 호스팅은 각 사이트마다 포트가 필요할 수도 있음)
- IP 주소 절약
- 단점
- SSL/TLS 적용 문제 (HTTPS 인증서 문제)
- HTTPS 사용 시, 요청이 오기 전에 암호화된 상태여서 웹 서버가 Host 헤더를 확인할 수 없음
- 즉, 한 IP에서 여러 도메인에 각각 다른 SSL 인증서를 적용하기 어려움
- 해결책 : SNI(Server Name Indication) 사용
- 서버 부하 증가 가능성
- 하나의 웹 서버에서 여러 사이트를 호스팅하므로 트래픽이 많으면 성능 저하 가능
- 해결책 : 로드 밸런서 사용 or 멀티 서버 구성
- 레거시 브라우저 호환성 문제
- 일부 오래된 브라우저는 SNI를 지원하지 않아 HTTPS가 정상 작동하지 않을 수 있음
- 해결책 : 최신 브라우저 사용을 권장하거나, 일부 도메인만 IP 기반 호스팅 적용
- DNS 설정 필수
- 모든 도메인이 하나의 IP를 바라보도록 DNS 설정이 필요
- 해결책 : 도메인 업체에서 A 레코드 설정을 정확히 해야 함
- Host 헤더를 기반으로 하기 때문에 수동으로 변경하거나 조작이 가능하다(보안 이슈)
- SSL/TLS 적용 문제 (HTTPS 인증서 문제)
- 작동 방식
- DNS 설정
- 각 도메인 이름 (예 : example1.com, example2.com) 이 동일한 서버의 IP 주소를 가리키도록 DNS 레코드 설정
- 클라이언트 요청
- 사용자가 웹 브라우저에 example1.com을 입력하면, 브라우저는 DNS 서버에 example1.com의 IP주소를 요청하고, DNS 서버는 서버의 IP 주소를 브라우저에게 반환
- HTTP 요청
- 브라우저는 서버의 IP 주소로 HTTP 요청을 보내고 이 때, HTTP 요청 헤더의 Host 필드에 example1.com을 포함해서 요청 전송
- 서버 처리
- 서버는 HTTP 요청을 받고, Host 필드를 확인하여 클라이언트가 example1.com을 요청했음을 확인
- 콘텐츠 제공
- 서버는 example1.com에 해당하는 웹사이트의 콘텐츠를 클라이언트에게 응답으로 제공
- DNS 설정
- 아키텍처
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
사용자 요청
│
├── [사용자A] http://example1.com
│ ↓
│ [DNS 서버] - example1.com → 192.168.1.10
│ ↓
│ [웹 서버] --[Host: example1.com]--> [example1.com 사이트 응답]
│
├── [사용자B] http://example2.com
│ ↓
│ [DNS 서버] - example2.com → 192.168.1.10
│ ↓
│ [웹 서버] --[Host: example2.com]--> [example2.com 사이트 응답]
│
└── [사용자C] http://example3.com
↓
[DNS 서버] - example3.com → 192.168.1.10
↓
[웹 서버] --[Host: example3.com]--> [example3.com 사이트 응답]
가상 호스팅 실습해보기
1. 스프링 부트 프로젝트 준비
- 두 개의 스프링 부트 프로젝트 (project1, project2) 생성
- 각 프로젝트의 application.properties에서 포트 번호 변경
- project1 : server.port=8081
- project2 : server.port=8082
- 각 프로젝트에 간단한 컨트롤러 추가하여 웹 페이지 제공
- project1 :
http://localhost:8081/hello접속 시 “Hi Project1” 메시지 출력 - project2 :
http://localhost:8082/hello접속 시 “Hi Project2” 메시지 출력
- project1 :
2. 스프링 부트 프로젝트 실행
- 각 프로젝트 둘다 실행
3. Nginx 설치
- Nginix 설치
- mac Os :
brew install nginx입력
- mac Os :
4. Nginx 설정 파일 수정
- Nginx 설정 파일(nginx.conf) 찾기
- mac Os :
sudo find / -name nginx.conf입력하여 위치 찾기 - 현재 나의 Nginx 설정 파일 위치 :
/opt/homebrew/etc/nginx/nginx.conf
- mac Os :
- Nginx 설정 파일 수정하기
sudo vi /opt/homebrew/etc/nginx/nginx.conf입력하여 수정- listen이 8080으로 되어있는 블록 주석 처리하고 새로운 블록 추가하여 가상 호스트 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
http { server { listen 80; // 80번 포트로 들어오는 요청을 처리 server_name www.example.com; // 가상 호스트의 호스트 이름을 지정 location / { proxy_pass http://localhost:8081; // 요청을 프록시할 서버 주소를 지정 proxy_set_header Host $host; // 요청 헤더를 스프링부트 프로젝트로 전달 proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name www.example.net; location / { proxy_pass http://localhost:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
5. 호스트 파일 수정
- 호스트 파일(hosts)를 수정하여
www.example.com과www.example.net을 로컬 IP 주소(127.0.0.1)에 연결- mac Os :
/etc/hosts sudo nano /etc/hosts입력
- mac Os :
- 호스트 파일에 다음 줄을 추가
1 2
127.0.0.1 www.example.com 127.0.0.1 www.example.net
dscacheutil -flushcache입력 -> DNS 캐시 삭제sudo killall -HUP mDNSResponder입력 -> DNS 캐시 삭제
6. Nginx 재시작
- Ngnix를 재시작하여 변경된 설정을 적용
- mac Os :
sudo nginx -s reload
- mac Os :
7. 웹 브라우저로 접속
- 웹 브라우저를 열고
http://www.example.com/hello와http://www.example.net/hello에 접속- 각각 메시지가 표시되는지 확인
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

