通过运行小型酿酒厂解释Web服务器(译)

458 阅读7分钟

如果您可以了解微型酿酒厂的不同输入和输出,那么您就可以了解Web服务器的工作方式。 当您刚开始进行Web开发时,您可能会想…… “当有人在浏览器中键入https://www.baidu.com时,所有这些新概念之间如何相互连接?” 因此,我想创建一个完整的指南,解释客户端(浏览器)和服务器端(多个服务器)之间的连接。 例如,您知道服务器和数据库之间的区别吗? 这就是问题所在:客户端-服务器模型的运行有点像小型酿酒厂。而且,如果您可以了解微型酿酒厂的不同部分,那么您就可以了解Web服务器的基础知识。

客户端-服务器模型

在这个微型酿酒厂,您的目标是向酒吧,酒类商店和超级市场出售大量啤酒。您有各种各样的客户,这些客户每周或每月都会有大笔订单。

这意味着客户会经常向您的销售团队打电话或发送带有请求的电子邮件。在互联网上,这被称为客户端。客户端不会与请求的网络的其他成员共享其任何计算能力。它只是要求某些内容或功能。

另一方面,您的啤酒厂运营团队存在,因此它可以酿造满足客户需求的啤酒。在这种情况下,它们就是服务器。这意味着他们等待来自客户端的请求,并使用其计算能力根据请求共享适当的资源。

客户端的常见示例是Chrome之类的网络浏览器。服务器位于远程位置,由诸如Amazon(Amazon Web Services)之类的公司管理。

您可能会认为这是一维的,就像“ Du,这些是任何购买过程的基础!”,但是正如您稍后将看到的那样,随着越来越多的参与者进入图片,它可能会变得更加复杂。

请求-响应模型

如您所见,客户端-服务器模型中的每一方都有不同的角色。客户端是请求者,服务器是响应者。

在一个非常基本的示例中,一家超市可能会发送一个请求,例如“我们需要20箱啤酒。”在将来的某个时候,您的微型啤酒厂将发送响应:所请求的啤酒。

同样,Chrome之类的浏览器会将请求发送到集中式服务器,服务器将返回请求的数据。例如,当您加载诸如reddit.com之类的页面时,服务器必须根据最新的upvote和注释数据发送新版本的主页。

因此,您的下一个问题可能是:“ Internet如何大规模处理这些请求和响应?”

首先,连接到网络(例如Internet)的每个设备都称为主机。每个主机都有一个唯一的IP地址用于标识。一个DNS服务器(新类型的服务器),如reddit.com一个URL到特定服务器的IP地址连接。

当您输入reddit.com之类的URL时,您没有直接连接到reddit的Web服务器。而是,您首先连接到由托管公司提供的此DNS服务器。然后,该服务器使用reddit服务器的特定地址响应您的请求。您的浏览器现在可以向reddit的服务器发出请求

想象一下,您是一家从微型酿酒厂订购第一笔啤酒的超级市场。您不能只打电话给酿酒厂并命令员工交付您的啤酒!取而代之的是,您致电销售人员或支持代理,以帮助您了解物流的工作方式,他们使用哪个分销商,交付速度有多快。销售代理就像DNS服务器,因为他们将共享实际完成物流的过程。订购。

接受所有条件后,您可以向专门酿造啤酒的生产团队提出要求。

因此,为了:

像Chrome这样的浏览器输入网址reddit.com 请求转到DNS服务器,该服务器以Reddit服务器的IP地址作为响应 浏览器现在向Reddit服务器发出请求 Reddit服务器响应首页 有时这称为“ 关注点分离 ”-它允许每个服务器执行专门的功能,以便每个部分都能最有效地工作。

端口说明

微型酿酒厂不能仅处理一种请求!在任何给定的一周内,它可能正在处理:

来自其供应商(例如装瓶公司,啤酒花供应商)的账单 来自客户的订单(如上所述) 新候选人的求职申请 这些请求中的每一种都必须交给啤酒厂的专门人员。

账单去会计部门 订单交给运营团队 职位应用转到人力资源部门

就像小型酿酒厂一样,服务器具有处理不同类型请求的途径。这些称为端口。一些常见的端口示例包括:

端口25- SMTP(电子邮件路由) 端口80-HTTP(如上所述的Web请求) 端口143- IMAP-电子邮件管理

这些端口允许Internet上的主机以标准化方式进行交互。如果没有通用的服务器配置,Internet将无法像今天一样运行。相反,它将迫使自定义配置与来自不同公司的服务器进行交互,这将使最终用户像今天一样,以无缝,流畅的方式进行交互变得更加困难

数据库适合存放在哪里?

到目前为止,我们已经介绍了单个请求到Web服务器的路径。在前端,您将使用JavaScript编写代码,服务器将使用Python或PHP之类的语言或node.js之类的框架来处理请求。

但是我们尚未涵盖数据库发挥作用的部分!该数据库用SQL或MongoDB或用于构建关系数据库的多种其他语言编写。但是,它没有存储到我们到目前为止一直使用的同一服务器上!

让我们回到微酿酒。酿造啤酒所用的原材料包括

瓶装 瓶盖 酒花 麦芽 水 您的啤酒厂可能会在现场存储少量这些原料,但也可能会使用外部仓库。例如,您不希望啤酒厂周围有成千上万的瓶子。太过分了 这些成分有点像存储在数据库中的信息。

外部仓库有点像专门运行数据库的服务器或数据库服务器。我们还分离了此功能,以使其尽可能高效。

数据库只是存储数据的数字结构。但是服务器提供了所有允许该数据库参与网络的操作协议。

因此,假设某个客户订购了1000箱啤酒。微型酿酒厂将需要与仓库进行通信,以交付更多瓶子。那是另一个请求-响应周期!

双重要求

在这种情况下,服务器既充当客户端又充当服务器。它正在接受来自最终用户的请求,但之后还会将请求发送到另一台服务器。它的响应取决于数据库服务器的响应。

最终用户当然看不到这些。从他们的角度来看,他们发送了请求并收到了回复。他们看不到幕后的服务器通信。

数据库+服务器的真实示例

Heroku是一项云服务,允许Web开发人员以最少的代码和持续的管理轻松地部署其应用程序。它使用虚拟容器,使您可以租用一小部分完整的服务器来运行您的应用程序。这是另一个教程的主题。

无论如何,Heroku允许您使用一个简单的命令将最新的提交实时推送到虚拟容器:git push heroku master。然后,在您从Namecheap之类的服务购买域并将其连接到您的Heroku应用之后,这些更改将生效。

但是,如果您想将数据库与实时应用程序一起使用(可能会使用),则仍然需要针对该数据库的单独的托管解决方案!我推荐ClearDB,它在Heroku的市场中有一个应用程序。ClearDB有一个慷慨的免费版本,可以随着数据库的增长而扩展。

因此,如果使用此堆栈,则最终用户发出要求您访问数据库的请求时,流程将是这样。

更多精彩文章欢迎关注公众号【前端】(qianduan_web)