服务器是否仅拥有一个网站?


80

据我了解,DNS链接的域名和网站存储服务器的IP地址,是否意味着每台服务器只能容纳一个网站?如果没有,那么如果同一服务器上有很多网站,调用服务器的IP地址怎么知道我想要哪个网站?


13
Wikipedia很好地介绍了共享虚拟主机。如果在浏览器中输入http:// <IP_ADDR> /,则HTTP请求的Host:标头中将没有域。在共享托管的情况下,提供商可以将Web服务器配置为以不同的方式处理此问题(例如,使用默认值,重定向到提供商等)。
绝地武士

我单击的链接打断了诸如“此服务器从未/当前不托管您要查找的网站”之类的消息。
Jesvin Jose

1
如果您正在寻找一种方法来在一台服务器上运行多个应用程序,请假设您分别在端口8001和8002上拥有两个应用程序MyApp和YourApp。您可以在以下位置拥有两个负载平衡器或应用程序代理:myapp.com和yourapp.com。让它们在默认端口(80/443)接收请求,并将请求分别转发到端口8001和8002的实际服务器。
rohithpr

6
好问题。每个网站以前都需要自己的IP地址(一台服务器可以有多个IP地址)。引入HTTP / 1.1中的Host标头是为了解决您所描述的确切问题。请参阅www8.org/w8-papers/5c-protocols/key/key.html中的
AE

6
如果http 1.1没有主机标头,则ipv6将在现在实现;-) :-(
Lenne

Answers:


149

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


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规范中未指定标头,但是某些服务器仍然支持它。)

从这里开始,Web服务器具有一些信息,可用来确定响应应该是什么。请注意,单个Web服务器可能绑定到多个IP地址。

  • 从TCP套接字请求的IP地址
    • 客户端的IP地址也可用,但是很少使用-有时用于阻止/过滤
  • 从TCP套接字请求的端口
  • Host浏览器在HTTP请求的标头中指定的请求的主机名。
  • 请求的路径
  • 任何其他标题(Cookie等)

您似乎已经注意到,如今最常见的共享主机设置是将多个网站放在一个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

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

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

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

您拨打该号码,然后有人接了电话。你说“我想和吉尔说话”,你就让她上线了。

它可能只是说“ Dormitory X”,而不是电话簿中的A记录(电话号码/ IP地址),然后您必须进一步寻找Dormitory X的号码。这是CNAME记录。

如果Jill不可用,您可能会得到

  • 404吉尔不在
  • 410吉尔死了。
  • 301吉尔与彼得同住
  • 卷302

  • 400我不明白你的意思。

  • 401你是谁?密码是什么?或晚上10点以后我们不允许男性来电者
  • 402付款要求(您确定Jill是她的真名吗?)
  • 403不,那不是正确的密码。
  • 418吉尔是个茶壶:-)
  • 429吉尔不能再接电话。
  • 451您违反了限制令。

  • 500我们的电话系统已损坏。


出于好奇,418后面的RFC是tools.ietf.org/html/rfc2324和有趣的文章sitesdoneright.com/blog/2013/03/… :)
Wordzilla

6

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

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

  • 网站,一组网页,形成一个连贯的整体。
  • IP地址,一个数字地址(IPv4为32位,IPv6为128位),由Internet协议用作流量的源或目的地。
  • 服务器,一台机器,其工作是服务于来自客户端的请求。
  • 主机名,用于在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会话要求服务器向客户端出示涵盖所请求主机名的证书,但是HTTP请求直到SSL / TLS会话建立后才到达。

通过使用该SubjectAltName字段或在该CommonName字段中使用通配符,可以使一个证书覆盖多个主机名。但是,这带来了管理上的挑战,尤其是当所涉及的主机名位于具有不同所有权的域下时。

因此,TLS引入了“服务器名称指示”(SNI)扩展名。使用此扩展名,客户端将在TLS握手过程中将请求的主机名发送到服务器。然后,服务器可以出示相应的证书。不幸的是,尽管所有主要SSL / TLS实现的当前版本都支持SNI,但较旧的版本却花了很长时间才能使用。


您忘了提到TCP可以侦听许多端口,每个端口上运行不同的服务器...
Toby Speight

是的,但是您在dns中没有端口号,并且您不能指望joe.p.user可以访问我们的fabulous.site:81此外,某些防火墙还会阻止对非标准端口号的出站访问。
Lenne

3

答案要比某些答案要复杂得多。当您执行DNS查找时,您必须获得IP地址(AIPv4,AAAAIPv6 记录)。您必须能够通过TCP / IP打开套接字进行通信,否则整个操作都会失败。该地址可能代表服务器,也可能代表负载均衡器。它甚至可以代表代理。例如,如果主机位于CloudFlare后面,则您获得的地址是CloudFlare服务器的地址。真正的服务器在其他地方。这使主机可以避免诸如拒绝服务攻击之类的问题。

虚拟主机就是您要问的问题(其他一些与此有关的问题,但没有任何细节)。虚拟主机接受Web请求并查看主机名(即domain.com),以确定要服务的网站。因此,在Apache HTTP Web服务器中,您将具有如下配置

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

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

例如,这被简化。因此,我们要告诉Apache侦听任何IP的端口80(在托管您计算机IP的现代虚拟机中,其IP可能与实际IP不同)。然后,我们告诉它这是domain.com网站以及该网站所在的目录。然后,我们可以一遍又一遍地重复此步骤,以告诉Apache处理不同的网站。每个Web服务器都支持这种类型的系统。

处理此问题的另一种方法是告诉Web服务器将所有Web流量定向到一个单独的编程脚本(即PHP,ASP.NET等),然后该单个脚本将确定要显示的网站和页面。


1

使用DNS,您可以根据需要为单个IP地址分配尽可能多的名称(例如,在主机文件中,您可以简单地用空格分隔每个名称)。使用DNS服务器,您还可以将多个IP地址分配给一个名称。它不限于一对一的关系。

Web服务器通过检查请求的URL 知道要服务的站点。它查看请求的域,请求的端口以及使用的协议。这与DNS无关,由HTTP协议处理。


0

Web服务器具有主机容器的概念(例如,是Tomcat的文档)。可以为同一个box / ip地址配置多个主机容器,为多个域提供服务。容器具有独立的工作目录,身份验证领域,日志目录等。

服务器找到新请求的相关容器,该HTTP请求中包含域的名称。

如果完全不同的Web服务器实例在不同的端口上运行,它们可以共享相同的IP地址。这主要用于各种可能无法使用域名的开发和测试环境,因为生产服务器无法在任意端口上运行。

最后,即使网站需要严格唯一的IP地址,服务器箱也经常具有多个网络适配器,因此配置为使用多个IP地址。


0

您的服务器IP地址可以同时拥有许多不同的域名。

当您访问网站时,浏览器将发送带有域名的HTTP请求,然后服务器可以找到应将其发送给您的网站数据。

它被称为虚拟主机,就这么简单:)

看看这里关于DNS和虚拟主机的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.