服务器只能容纳一个网站吗?

服务器只能容纳一个网站吗?

据我所知,DNS 将域名与网站所在服务器的 IP 地址关联起来,这是否意味着每台服务器只能容纳一个网站?如果不是这样,如果同一台服务器上有多个网站,如何通过调用服务器的 IP 地址知道我想要哪个网站?

答案1

基本上:浏览器在 HTTP 请求中包含域名,因此 Web 服务器知道请求了哪个域并可以做出相应的响应。


HTTP 请求

典型的 HTTP 请求的发生方式如下:

  1. 用户提供一个 URL,格式为http://host:port/path

  2. 浏览器会提取 URL 的主机(域)部分,并在必要时将其转换为 IP 地址,这个过程称为名称解析。此转换可以通过 DNS 进行,但不一定如此(例如,hosts常见操作系统上的本地文件会绕过 DNS)。

  3. 浏览器在该 IP 地址上打开到指定端口(或默认为端口 80)的 TCP 连接。

  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 套接字的请求端口
  • 请求的主机名,如Host浏览器在 HTTP 请求的标头中指定的。
  • 请求的路径
  • 任何其他标头(cookie 等)

您似乎已经注意到,目前最常见的共享主机设置将多个网站放在单个 IP 地址:端口组合上,只是Host为了区分网站。

这被称为基于名称的虚拟主机在 Apache 领域,而 Nginx 则称它们为服务器块中的服务器名称并且 IIS 更喜欢虚拟服务器


那么 HTTPS 呢?

HTTPS 略有不同。在建立 TCP 连接之前,一切都相同,但此后必须建立加密的 TLS 隧道。目标是不泄露有关请求的任何信息。

为了验证服务器确实拥有该域名,服务器必须发送由受信任的第三方签名的证书。然后浏览器会将此证书与其请求的域名进行比较。

这就带来了一个问题,如果服务器需要在收到 HTTP 请求之前发送证书,那么服务器如何知道要发送哪个主机(网站)的证书呢?

传统上,这个问题的解决方法是为每个需要 HTTPS 的网站提供专用的 IP 地址(或端口)。显然,随着 IPv4 地址开始用尽,这将成为问题。

进入信噪比(服务器名称指示)。浏览器现在在 TLS 协商期间传递主机名,因此服务器可以提前获得此信息以发送正确的证书。在服务器端,配置与 HTTP 虚拟主机的配置方式非常相似。

缺点是主机名在加密之前以纯文本形式传递,本质上是泄露的信息。考虑到主机名通常会在 DNS 查询中暴露,这通常被认为是可以接受的权衡。


如果您仅通过 IP 地址请求站点会怎样?

当服务器不知道您请求哪个特定主机时,它会做什么取决于服务器的实现和配置。通常,会指定一个“默认”、“通用”或“后备”站点,它将为所有未明确指定主机的请求提供响应。

该默认站点可以是它自己的独立站点(通常显示错误消息),也可以是服务器上的任何其他站点,具体取决于服务器管理员的偏好。

答案2

对于非技术人员,我有这样的解释。

杰克、吉尔和乔住在宿舍,他们没有手机。

在电话簿中,它们都以相同的号码列出。(A 记录)

您拨打电话号码,然后有人接电话;您说“我想和吉尔通话”,然后她就接通了电话。

电话簿中可能只显示“X 宿舍”,而不是 A 记录(电话号码/IP 地址),那么您必须进一步查找 X 宿舍的号码。这是一条 CNAME 记录。

如果 Jill 不在,你可能会得到

  • 404 Jill 不在
  • 410 吉尔死了。
  • 301 Jill 搬去和 Peter 同住
  • 302 Jill 正在拜访 Peter,请给他打电话

  • 400 我不明白你的意思。

  • 401 你是谁?密码是什么?或晚上 10 点后我们不允许男性来电
  • 402 需要付款(你确定 Jill 是她的真名吗 ;-))
  • 403 不,这不是正确的密码。
  • 418 吉尔是一把茶壶:-)
  • 429 吉尔无法再接听任何电话。
  • 451 您正在违反您的限制令。

  • 500 我们的电话系统坏了。

答案3

据我了解,DNS 将域名与存储网站的服务器的 IP 地址链接起来,这是否意味着每个服务器只能容纳一个网站?

首先,您需要了解这里有许多不同的概念。

  • 网站,一组构成连贯整体的网页。
  • IP 地址,互联网协议用作流量源或目的地的数字地址(IPv4 为 32 位,IPv6 为 128 位)。
  • 服务器,其职责是响应客户端的请求。
  • 主机名,用于在 DNS 中标识机器的名称(例如“www.example.com”或“en.wikipedia.org”)

这些之间不存在一对一的关系。一台服务器可以有多个 IP 地址;多个主机名可以指向一个 IP 地址;一个主机名可以指向多个 IP 地址。多个网站可以位于同一个主机名下。一个网站可以分布在多个主机名上。

如果没有的话,如果同一台服务器上有多个网站,那么如何通过调用服务器的 IP 地址知道我想要哪个网站?

在过去(HTTP 1.0 及之前),服务器需要以不同方式处理的每个主机名都必须有自己的 IP 地址。这相当浪费。

HTTP 1.1Host在 HTTP 请求中添加了“标头”作为必填字段(IIRC 一些供应商以前曾将其作为扩展支持)。这告诉服务器请求了哪个主机名,从而允许它为同一 IP 地址上的不同主机名提供不同的内容。客户端对 HTTP 1.1 的支持现在无处不在。

不幸的是,SSL(后来的 TLS)增加了一个问题。建立 SSL/TLS 会话需要服务器向客户端提供涵盖所请求主机名的证书,但 HTTP 请求直到 SSL/TLS 会话建立后才会到达。

SubjectAltName通过使用字段或字段中的通配符,可以让一个证书涵盖多个主机名CommonName。然而,这会带来管理挑战,尤其是当所涉及的主机名属于不同所有权的域时。

因此 TLS 引入了“服务器名称指示”(SNI) 扩展。使用此扩展,客户端在 TLS 握手过程中将请求的主机名发送给服务器。然后服务器可以提供适当的证书。不幸的是,虽然所有主要 SSL/TLS 实现的当前版本都支持 SNI,但旧版本已经过时了。

答案4

使用 DNS,您可以根据需要为单个 IP 地址分配任意多个名称(在您的hosts 文件例如,您可以简单地用空格分隔每个名称。使用 DNS 服务器,您还可以为单个名称分配多个 IP 地址.它不局限于一对一的关系。

Web 服务器知道要为哪个网站提供服务检查请求的 URL。它会查看请求了哪个域、请求了哪个端口以及使用了哪种协议。这与 DNS 无关,由 HTTP 协议处理。

相关内容