서버는 하나의 웹 사이트 만 보유합니까?


80

내가 DNS 링크를 이해하는 것처럼 웹 사이트가 저장된 서버의 IP 주소와 도메인 이름이 각 서버에 하나의 웹 사이트 만 보유 할 수 있습니까? 그렇지 않은 경우 서버의 IP 주소를 호출하면 동일한 서버에 많은 웹 사이트가있는 경우 원하는 웹 사이트를 어떻게 알 수 있습니까?


13
Wikipedia에는 공유 웹 호스팅에 대한 좋은 소개가 있습니다. 브라우저에 http : // <IP_ADDR> /를 입력하면 HTTP 요청에 Host:헤더 내에 도메인이 없습니다 . 공유 호스팅의 경우, 제공자는 웹 서버를 다른 방식으로 처리하도록 구성 할 수 있습니다 (예 : 기본값, 제공자로 리디렉션 등).
제다이

"이 서버는 찾고있는 웹 사이트를 결코 / 현재 호스팅하지 않습니다"와 같은 메시지와 함께 링크를 클릭했습니다.
Jesvin Jose

1
단일 서버에서 여러 응용 프로그램을 실행하는 방법을 찾고 있다면 포트 8001 및 8002에 각각 MyApp 및 YourApp 응용 프로그램이 두 개 있다고 가정하십시오. myapp.com과 yourapp.com에 두 개의로드 밸런서 또는 응용 프로그램 프록시가있을 수 있습니다. 기본 포트 (80/443)에서 요청을 수신하여 포트 8001 및 8002의 실제 서버로 각각 전달하십시오.
rohithpr 2016 년

6
좋은 질문입니다. 모든 웹 사이트에는 자체 IP 주소가 필요했습니다 (서버는 둘 이상의 IP 주소를 가질 수 있음). 설명하는 정확한 문제를 해결하기 위해 HTTP / 1.1의 호스트 헤더가 도입되었습니다. www8.org/w8-papers/5c-protocols/key/key.html의
AE

6
http 1.1에 호스트 헤더가 없다면 ipv6은 이제 ;-)에 의해 구현 될 것입니다 :-(
Lenne

답변:


149

기본적으로 브라우저는 HTTP 요청에 도메인 이름을 포함하므로 웹 서버는 요청 된 도메인을 알고 이에 따라 응답 할 수 있습니다.


HTTP 요청

일반적인 HTTP 요청은 다음과 같습니다.

  1. 사용자는 형식으로 URL을 제공합니다 http://host:port/path.

  2. 브라우저는 URL의 호스트 (도메인) 부분을 추출하여 필요한 경우 이름 확인 프로세스에서 IP 주소로 변환합니다 . 이 변환은 DNS를 통해 발생할 수 있지만 반드시 수행 할 필요는 없습니다 (예 : hosts공통 OS 의 로컬 파일은 DNS를 무시 함).

  3. 브라우저는 해당 IP 주소에서 지정된 포트에 대한 TCP 연결을 열거 나 기본적으로 포트 80을 엽니 다.

  4. 브라우저가 HTTP 요청을 보냅니다. HTTP / 1.1의 경우 다음과 같습니다.

    GET /path HTTP/1.1
    Host: example.com
    

    ( Host헤더는 표준이며 HTTP / 1.1에 필요합니다. HTTP / 1.0 사양에 지정되지 않았지만 일부 서버는이를 지원합니다.)

여기에서 웹 서버에는 응답이 무엇인지 결정하는 데 사용할 수있는 몇 가지 정보가 있습니다. 단일 웹 서버가 여러 IP 주소에 바인딩 될 수 있습니다.

  • TCP 소켓에서 요청한 IP 주소
    • 클라이언트의 IP 주소도 사용 가능하지만 거의 사용하지 않는 경우가 있습니다-때때로 차단 / 필터링
  • TCP 소켓에서 요청한 포트
  • HostHTTP 요청에서 브라우저가 헤더에 지정한 요청 된 호스트 이름 입니다.
  • 요청 된 경로
  • 다른 헤더 (쿠키 등)

알다시피 요즘 가장 일반적인 공유 호스팅 설정은 여러 웹 사이트를 단일 IP 주소 : 포트 조합에 배치하여 Host웹 사이트를 구별 할 수 있습니다.

이것은 Apache-land에서 이름 기반 가상 호스트 로 알려져 있으며 Nginx는 서버 블록에서 서버 이름을 호출 하고 IIS는 Virtual Server를 선호합니다 .


HTTPS는 어떻습니까?

HTTPS는 약간 다릅니다. 모든 것은 TCP 연결 설정과 동일하지만 그 후에 암호화 된 TLS 터널을 설정해야합니다. 목표는 요청에 대한 정보를 유출하지 않는 것입니다.

서버가 실제로이 도메인을 소유하고 있는지 확인하려면 서버는 신뢰할 수있는 타사가 서명 한 인증서를 보내야합니다. 그런 다음 브라우저는이 인증서를 요청한 도메인과 비교합니다.

문제가 있습니다. HTTP 요청을 수신하기 전에 어떤 호스트 (웹 사이트)의 인증서를 보내야하는지 서버는 어떻게 알 수 있습니까?

전통적으로 이는 HTTPS가 필요한 모든 웹 사이트에 대해 전용 IP 주소 (또는 포트)를 사용하여 해결되었습니다. IPv4 주소가 부족 해지면 문제가됩니다.

SNI (서버 이름 표시)를 입력하십시오 . 브라우저는 이제 TLS 협상 중에 호스트 이름을 전달하므로 서버는 올바른 인증서를 보낼 수있을만큼 일찍이 정보를 갖습니다. 서버 측에서 구성은 HTTP 가상 호스트 구성 방법과 매우 유사합니다.

단점은 이제 호스트 이름이 암호화 전에 일반 텍스트로 전달되며 본질적으로 정보가 유출된다는 것입니다. 어쨌든 호스트 이름이 일반적으로 DNS 쿼리에 노출된다는 점을 고려할 때 이는 일반적으로 허용 가능한 교환으로 간주됩니다.


IP 주소로만 사이트를 요청하면 어떻게됩니까?

요청한 특정 호스트를 모르는 경우 서버가 수행하는 작업은 서버 구현 및 구성에 따라 다릅니다. 일반적으로 호스트를 명시 적으로 지정하지 않은 모든 요청에 ​​대한 응답을 제공하는 "기본", "catchall"또는 "대체"사이트가 지정되어 있습니다.

이 기본 사이트는 자체 독립 사이트 (종종 오류 메시지 표시)이거나 서버 관리자의 환경 설정에 따라 서버의 다른 사이트 일 수 있습니다.


1
또한 Heroku 및 Amazon과 같은로드 밸런서와 마찬가지로 하나의 사이트가 여러 서버로 분할 될 수 있습니다.
phyrfox

1
@ phyrfox 그래, 나는 그것을 추가하는 것에 대해 생각했지만, 그것은 질문과 접하게 관련되어 있으며 대답을 너무 길게 만들고 싶지 않았습니다. 나중에 섹션을 추가 할 수도 있습니다.

전설에 따르면 하위 도메인은 네트워크 내의 특정 컴퓨터를 가리 킵니다. 이론상
Loupax

"전통적으로, 이것은 HTTPS가 필요한 모든 웹 사이트에 전용 IP 주소 (또는 포트)를 가짐으로써 해결되었습니다. 분명히, 이것은 IPv4 주소가 부족해지기 시작함에 따라 문제가됩니다." .
Lenne

92

나는 기술이 아닌 사람들을 위해이 설명이 있습니다.

Jack, Jill 및 Joe는 기숙사에 살고 있으며 핸드폰이 없습니다.

전화 번호부에는 모두 같은 번호로 나열되어 있습니다. (A 레코드)

전화를 걸면 누군가 전화를받습니다. "질에게 말하고 싶다"고 말하고 전화를 겁니다

전화 번호부의 A- 레코드 (전화 번호 / IP- 주소) 대신 "Dormitory X"라고 표시 될 수 있습니다. 그런 다음 Dormitory X의 번호를 더 찾아야합니다. 이것은 CNAME 레코드입니다.

Jill을 사용할 수없는 경우

  • 404 질은 여기 없어
  • 410 질이 죽었다.
  • 301 Jill이 Peter와 함께 이사
  • 302 Jill이 Peter를 방문하고 대신 전화하십시오.

  • 400 이해할 수 없습니다.

  • 401 누구세요? 비밀번호가 무엇입니까? 또는 오후 10시 이후에는 남성 발신자를 허용하지 않습니다.
  • 402 지불이 필요하다
  • 403 아니요, 올바른 비밀번호가 아닙니다.
  • 418 Jill은 주전자입니다 :-)
  • 429 Jill은 더 이상 전화를받을 수 없습니다.
  • 451 구속 명령을 위반하고 있습니다.

  • 500 전화 시스템이 고장났습니다.


궁금한 점은 418 뒤에있는 RFC는 tools.ietf.org/html/rfc2324 이며 흥미로운 기사 sitesdoneright.com/blog/2013/03/… :)
Wordzilla

6

내가 DNS 링크를 이해하는 것처럼 웹 사이트가 저장된 서버의 IP 주소와 도메인 이름이 각 서버에 하나의 웹 사이트 만 보유 할 수 있습니까?

먼저 여기에는 여러 가지 고유 한 개념이 있음을 이해해야합니다.

  • 웹 사이트, 일관된 전체를 형성하는 웹 페이지 그룹.
  • 인터넷 프로토콜이 트래픽의 소스 또는 대상으로 사용하는 숫자 주소 (IPv4의 경우 32 비트, IPv6의 경우 128 비트) 인 IP 주소.
  • 클라이언트의 요청을 처리하는 기계 인 서버.
  • 호스트 이름, DNS에서 컴퓨터를 식별하는 데 사용되는 이름 (예 : "www.example.com"또는 "en.wikipedia.org")

이러한 것 사이에는 일대일 관계가 없습니다. 하나의 서버는 여러 개의 IP 주소를 가질 수 있습니다. 여러 개의 호스트 이름이 하나의 IP 주소를 가리킬 수 있습니다. 하나의 호스트 이름은 여러 IP 주소를 가리킬 수 있습니다. 여러 웹 사이트가 동일한 호스트 이름으로 존재할 수 있습니다. 하나의 웹 사이트를 여러 호스트 이름으로 분산시킬 수 있습니다.

그렇지 않은 경우 서버의 IP 주소를 호출하면 동일한 서버에 많은 웹 사이트가있는 경우 원하는 웹 사이트를 어떻게 알 수 있습니까?

이전 (HTTP 1.0 이전)에는 서버가 다르게 처리하려는 각 호스트 이름에 고유 한 IP 주소가 있어야했습니다. 이것은 다소 낭비 적이었습니다.

HTTP 1.1은 Host"HTTP 요청에서 헤더를 필수 필드로 추가했습니다 (IIRC는 일부 벤더가이를 확장으로 지원했습니다). 이것은 서버에게 요청 된 호스트 이름을 알려주므로 동일한 호스트에서 다른 호스트 이름에 대해 서로 다른 컨텐츠를 제공 할 수 있습니다. IP 주소 클라이언트에서 HTTP 1.1을 지원하는 기능은 이제 어디에나 있습니다.

불행히도 SSL (나중에 TLS)은 주름을 추가했습니다. SSL / TLS 세션을 설정하려면 서버가 요청한 호스트 이름을 포함하는 클라이언트에 인증서를 제공해야하지만 SSL / TLS 세션이 설정 될 때까지 HTTP 요청이 도착하지 않습니다.

SubjectAltName필드를 사용하거나 필드에서 와일드 카드를 사용 하여 하나의 인증서로 여러 호스트 이름을 포괄 할 수 CommonName있습니다. 그러나 특히 호스트 이름이 다른 소유권을 가진 도메인에있는 경우 관리상의 문제가 발생합니다.

그래서 TLS는 "서버 이름 표시"(SNI) 확장을 도입했습니다. 이 확장을 사용하면 클라이언트는 TLS 핸드 셰이크 절차 동안 요청 된 호스트 이름을 서버로 보냅니다. 그런 다음 서버는 적절한 인증서를 제시 할 수 있습니다. 불행히도, 모든 주요 SSL / TLS 구현의 현재 버전은 SNI를 지원하지만 이전 버전의 사용이 중단되는 데 오랜 시간이 걸렸습니다.


TCP가 각 포트마다 다른 서버를 실행하면서 많은 포트에서 수신 대기 할 수 있다는 점을 잊어 버렸습니다.
Toby Speight

네,하지만 당신은 DNS에 portnumbers이없는, 당신은 joe.p.user이 가야 기대할 수 없다 our.fabulous.site:81 게다가, 일부 방화벽은 표준이 아닌 portnumbers 나가는 접근을 차단합니다.
Lenne

3

그 대답은 일부 대답보다 더 복잡합니다. DNS 조회를 수행 할 때 반드시 IP 주소 A를 가져와야 합니다 ( IPv4, AAAAIPv6 레코드 ). 통신하려면 TCP / IP를 통해 소켓을 열어야합니다. 그렇지 않으면 모든 것이 실패합니다. 해당 주소는 서버를 나타내거나로드 밸런서를 나타낼 수 있습니다. 심지어 프록시를 나타낼 수도 있습니다. 예를 들어 호스트가 CloudFlare 뒤에있는 경우 얻는 주소는 CloudFlare 서버의 주소입니다. 실제 서버는 다른 곳에 있습니다. 이를 통해 호스트는 서비스 거부 공격과 같은 문제를 피할 수 있습니다.

가상 호스팅 은 당신이 요구하는 것입니다 (다른 질문 중 일부는 이것에 대해 자세히 다루지 않았습니다). 가상 호스팅은 웹 요청을 받고 호스트 이름 (예 : domain.com)을 확인하여 서비스 할 웹 사이트를 결정합니다. 따라서 Apache HTTP 웹 서버에서는 다음과 같은 구성을 갖습니다.

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com

    DocumentRoot /var/www/domain.com
</virtualHost>

이것은 예를 들어 단순화됩니다. 따라서 우리는 Apache에게 모든 IP의 포트 80을 수신하도록 지시합니다 (컴퓨터의 IP를 호스팅하는 최신 가상 머신에서는 실제 IP와 다를 수 있음). 그런 다음 이것이 domain.com웹 사이트이며 해당 웹 사이트가 어떤 디렉토리에 있는지 알려줍니다 . 그런 다음이 블록을 반복해서 반복하여 Apache가 다른 웹 사이트를 처리하도록 할 수 있습니다. 모든 웹 서버는이 유형의 시스템을 지원합니다.

이를 처리하는 또 다른 방법은 웹 서버에 모든 웹 트래픽을 하나의 단일 프로그래밍 스크립트 (예 : PHP, ASP.NET 등)로 보내도록 지시 한 다음 해당 단일 스크립트가 표시 할 웹 사이트 및 페이지를 결정하는 것입니다.


1

DNS를 사용하면 원하는만큼 개별 IP 주소에 많은 이름을 지정할 수 있습니다 ( 호스트 파일 에서 각 이름을 공백으로 간단히 구분할 수 있음). DNS 서버를 사용하여 단일 이름에 여러 IP 주소를 할당 할 수도 있습니다 . 일대일 관계로 제한되지 않습니다.

웹 서버는 요청 된 URL 을 검사 하여 서비스 할 사이트를 알고 있습니다 . 요청 된 도메인, 요청 된 포트 및 사용 된 프로토콜을 확인합니다. 이것은 DNS와 관련이 없으며 HTTP 프로토콜에 의해 처리됩니다.


0

웹 서버는 호스트 컨테이너의 개념 (이 여기에 톰캣에 대한 설명서는 예를 들어,이다). 동일한 호스트 / IP 주소에 대해 여러 호스트 컨테이너를 구성하여 여러 도메인을 처리 할 수 ​​있습니다. 컨테이너에는 독립적 인 작업 디렉토리, 인증 영역, 로그 디렉토리 등이 있습니다.

서버는 새 요청 구매와 관련된 컨테이너를 찾고 도메인 이름이이 HTTP 요청의 일부입니다.

완전히 다른 웹 서버 인스턴스가 다른 포트에서 실행되는 경우 동일한 IP 주소를 공유 할 수 있습니다. 프로덕션 서버가 임의의 포트에서 실행될 수 없으므로 도메인 이름을 사용할 수없는 다양한 개발 및 테스트 환경에서 주로 사용됩니다.

마지막으로 웹 사이트에 고유 한 IP 주소가 필요한 경우에도 서버 상자에 여러 개의 네트워크 어댑터가 있으므로 여러 개의 IP 주소를 사용하도록 구성됩니다.


0

서버 IP 주소는 여러 도메인 이름을 동시에 보유 할 수 있습니다.

웹 사이트에 액세스하면 브라우저가 도메인 이름으로 HTTP 요청을 보내면 서버는 다시 보내야 할 웹 사이트 데이터를 찾을 수 있습니다.

그것은 가상 호스트라고 불립니다.

여기 DNS 및 가상 호스트에 대한 자세한 내용은.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.