포스트

가상 호스팅 🌈

가상 호스팅 🌈

가상 호스팅

가상 호스팅의 종류

  1. IP 기반 가상 호스팅(IP-Based Virtual Hosting)
  2. 이름 기반 가상 호스팅(Named-Based Virtual Hosting)
  3. 포트 기반 가상 호스팅(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 기반 가상 호스팅은 각 사이트마다 포트가 필요할 수도 있음)
  • 단점
    • SSL/TLS 적용 문제 (HTTPS 인증서 문제)
      • HTTPS 사용 시, 요청이 오기 전에 암호화된 상태여서 웹 서버가 Host 헤더를 확인할 수 없음
      • 즉, 한 IP에서 여러 도메인에 각각 다른 SSL 인증서를 적용하기 어려움
      • 해결책 : SNI(Server Name Indication) 사용
    • 서버 부하 증가 가능성
      • 하나의 웹 서버에서 여러 사이트를 호스팅하므로 트래픽이 많으면 성능 저하 가능
      • 해결책 : 로드 밸런서 사용 or 멀티 서버 구성
    • 레거시 브라우저 호환성 문제
      • 일부 오래된 브라우저는 SNI를 지원하지 않아 HTTPS가 정상 작동하지 않을 수 있음
      • 해결책 : 최신 브라우저 사용을 권장하거나, 일부 도메인만 IP 기반 호스팅 적용
    • DNS 설정 필수
      • 모든 도메인이 하나의 IP를 바라보도록 DNS 설정이 필요
      • 해결책 : 도메인 업체에서 A 레코드 설정을 정확히 해야 함
    • Host 헤더를 기반으로 하기 때문에 수동으로 변경하거나 조작이 가능하다(보안 이슈)
  • 작동 방식
    1. DNS 설정
      • 각 도메인 이름 (예 : example1.com, example2.com) 이 동일한 서버의 IP 주소를 가리키도록 DNS 레코드 설정
    2. 클라이언트 요청
      • 사용자가 웹 브라우저에 example1.com을 입력하면, 브라우저는 DNS 서버에 example1.com의 IP주소를 요청하고, DNS 서버는 서버의 IP 주소를 브라우저에게 반환
    3. HTTP 요청
      • 브라우저는 서버의 IP 주소로 HTTP 요청을 보내고 이 때, HTTP 요청 헤더의 Host 필드에 example1.com을 포함해서 요청 전송
    4. 서버 처리
      • 서버는 HTTP 요청을 받고, Host 필드를 확인하여 클라이언트가 example1.com을 요청했음을 확인
    5. 콘텐츠 제공
      • 서버는 example1.com에 해당하는 웹사이트의 콘텐츠를 클라이언트에게 응답으로 제공
  • 아키텍처
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” 메시지 출력

2. 스프링 부트 프로젝트 실행

  • 각 프로젝트 둘다 실행

3. Nginx 설치

  • Nginix 설치
    • mac Os : brew install nginx 입력

4. Nginx 설정 파일 수정

  • Nginx 설정 파일(nginx.conf) 찾기
    • mac Os : sudo find / -name nginx.conf 입력하여 위치 찾기
    • 현재 나의 Nginx 설정 파일 위치 : /opt/homebrew/etc/nginx/nginx.conf
  • 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.comwww.example.net 을 로컬 IP 주소(127.0.0.1)에 연결
    • mac Os : /etc/hosts
    • sudo nano /etc/hosts 입력
  • 호스트 파일에 다음 줄을 추가
    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

7. 웹 브라우저로 접속

  • 웹 브라우저를 열고 http://www.example.com/hellohttp://www.example.net/hello 에 접속
    • 각각 메시지가 표시되는지 확인
  1. www.example.com/hello 로 접속
    가상호스트 실습1
    • 호스트는 www.example.com으로 나오고, Server는 nginx/1.27.4로 정상적으로 나온다.
  2. www.example.net/hello 로 접속
    가상호스트 실습2
    • 호스트는 www.example.net으로 나오고, Server는 nginx/1.27.4로 정상적으로 나온다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.