一点一滴成长

导航

与http协作的web服务器

1、虚拟主机

  一台web服务器可以搭建多个独立域名的web网站,也可以作为通信线路上的中转服务器提升传输效率。比如web托管服务供应商可以用一台服务器为多个不同域名的客户提供服务,这是利用了虚拟主机(virtual host,又称虚拟服务器)的功能。在发送http请求时,必须在Host首部内完整指定主机名或域名的URI,以确定要请求的web网站。

2、代理

  通信数据转发程序:代理、网关、隧道、中继。

  如下图,转发“客户端”和“服务器”之间的数据,使用代理服务器可以利用其缓存技术减少网络带宽流量,也可以控制内部对特定网站的访问。每次通过代理服务器转发请求或响应时,会追加写入via首部信息。代理不改变请求的URI,它直接发送给前方的目标服务器。转发时不对报文做任何加工则为透明代理,否则为非透明代理。

  

  代理服务器或客户端本地保存的资源副本称为缓存,缓存服务器是代理服务器的一种。即使存在缓存,也会因为缓存的有效期、客户端的要求等因素,向服务器确认资源的有效性。

  正向代理:客户端将请求发给代理服务器,由代理服务器获得目的服务器的数据后将数据再发给客户端。所以客户端除了目的服务器之外,还需要设置代理服务器的地址,比如在浏览器中输入目的网址后,还需要在设置中设置代理服务器地址。正向代理是为客户端提供代理服务,需要客户主动设置代理服务器的信息,其一般用在客户端无法访问到目的或者加速访问服务的情况。

  反向代理:反向代理服务器也是位于用户与实际服务器之间,但对于用户而言,反向代理服务器就相当于目标服务器,在浏览器中直接输入反向代理服务地址就能访问数据,不需要实际服务器地址。反向代理服务器通常用来作为Web加速,比如负载均衡,所以代理服务实际上是为后端的服务器提供的,我们把为客户提供服务的代理称为正向代理,所以为后端提供代理称为反向代理。

3、反向代理和负载均衡

  上面提到的反向代理,nginx就提供了这种反向代理的功能,并提供了SLB(服务器负载均衡)策略,比如轮询(请求被顺序分配)、加权(权重高的被分配到的请求越多)、ip_hash(按用户IP值的哈希来分配,这样每个访客固定访问一个服务器,解决session问题:用户会话在多台服务器间切换导致的状态丢失)、最小连接(最少连接的服务器优先分配请求,适合不同的请求处理时间差异大的服务)、最短响应时间(按照服务器的响应时间来分配请求,属于第三方策略)等。

  负载均衡除了通过反向代理实现外,还有客户端负载均衡、重定向、DNS负载均衡等,当然这些主要针对的是HTTP Web通信。以下内容转载自 infoQ:负载均衡概述及优缺点对比

  ⓪、客户端负载均衡

    客户端通过服务注册中心获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;客户端可以通过心跳机制(长连接)或定时轮询来维护服务端清单的有效性。服务端清单可以缓存到本地,防止注册中心服务挂了。Spring Cloud Ribbon、Dubbo Consumer 都属于客户端负载均衡SDK。

    111

  ①、重定向负载均衡

        如下所示,每次请求,都需要两次 http 通信,延时较长,而且对外暴露了服务器地址,不安全:

 

  ②、DNS负载均衡

      如下所示,对于每次请求,DNS 解析到的 IP 地址不同,从而实现了负载均衡。DNS是一个分布式网络服务,一般不必担心它的性能问题,许多DNS还支持基于地理位置的域名解析,将域名解析成距离用户地理最近的一个服务器地址,以加快访问速度,所以这种负载均衡方式也较常用。这种方式的缺点是DNS负载均衡的控制权在域名服务商手里,有的DNS负载均衡策略采用的是简单的轮询算法,不能区分服务器之间的差异,个人可能无法做出过多的改善和管理。

  

  使用该方式的另外一个缺点是,客户中可能会缓存DNS地址,更改了某个地址或者某个服务出错的话可能不会那么快改变为正常的服务地址。所以实际使用该方式的时候,会使用两层反向代理,在应用服务器之前有一层反向代理即负载均衡服务来获得指定的服务地址,DNS 负载均衡用于第一层负载均衡,解析出来的是第二层负载均衡服务器的地址,若某一个服务出错,在第二层负载均衡可以感知到然后将其从服务集群中去掉。使用这种方式的两层反向代理,应用服务器集群还可以放到内网中去,更加安全。 

③、应用层反向代理

     如下所示,应用层反向代理相当于是一个转发服务器(七层转发),它通过分析用户发送的HTTP包来将请求进行转发,nagix 本身的反向代理服务器,就有该功能。因为处理的是应用层的http数据,所以对对反向代理服务器压力很大,一般应用服务器最多是几十台,因此,大一些的网站不会使用这种模式。新的nginx增加了支持四层转发的功能,所以nginx也支持传输层反向代理,直接对TCP数据进行转发,比七层转发性能要高。

 

  ④、网络层反向代理负载均衡

    如下所示,负载均衡服务器需要设置为后端服务器的网关(所以负载均衡服务器和后端服务器需要处于同一VLAN局域网内),当把负载均衡服务器设置为后端服务的网关后,后端服务向外发送的数据都会经过负载均衡服务器。负载均衡服务工作在IP层,它将客户发来的数据包中的目标地址(IP地址、端口、MAC地址)修改为后台服务的地址(根据负载均衡算法选择一台后端服务器),然后数据包被发送给后端服务。因为负载均衡服务器是后端服务器的网关,所以后端应用发送给客户的数据都会被发送给负载均衡服务器,负载均衡服务将收到的响应数据包中的源地址修改为自己的地址,然后数据包被发送给客户。

 

     

    网络层负载均衡方式虽然会修改MAC地址,但其是通过分析数据包的目标IP地址、目标端口、源IP地址、源端口来做出转发决策的,所以其被称为网络层负载均衡(IP地址在IP网络层)或四层负载均衡(端口号在四层传输层),而不是三层负载均衡。这种负载均衡方式的缺点是请求和响应数据都通过负载均衡服务器,尤其是一般响应数据会比较大,负载均衡的网络出口带宽压力会比较大。网络层负载均衡方式的另一个缺点就是后端服务必须与负载均衡服务器处于同一局域网内。

  ⑤、网络层反向代理负载均衡的公网实现

    也可以除了修改客户发来数据包中的目标地址外,还修改源地址为负载均衡服务器的地址,负载均衡服务器收到响应数据包后除了修改源地址外,还修改目的地址为客户地址。这样通过双重地址转换,相当于是客户和负载均衡服务是单独的连接,负载均衡服务和后端服务是单独的连接,解除了负载均衡服务器和后端服务器之间的路由依赖,所以负载均衡器不再需要以网关的形式存在。这就是网络层负载均衡的第二种实现方式,这种方式的优点是负载均衡服务和后端服务不需要在一个局域网内,而且因为解耦了网络拓扑,使得能够进行跨机房、跨地域的水平扩展架构,同时也有利于软件层面进行优化,提升转发效率。使用这种负载均衡方式的时候需要注意后端服务收到的数据中的IP地址是负载均衡服务器的地址,而不是客户端的IP。

  ⑥、数据链路层反向代理负载均衡

     如下所示,将后端服务器的虚拟IP地址(VIP, Virtual IP Address)配置成与负载均衡服务器的IP一样,负载均衡服务需要与后端服务处于同一局域网内,因为负载均衡服务通过修改用户数据的MAC地址为后端应用服务地址(根据负载均衡算法选择一台后端服务器)来将数据转发给后端服务。而后端响应数据会直接发送到用户那里,因为响应数据的源地址与请求数据的目的地址相同。因为仅修改了用户数据的MAC地址,所以这种方式一般被称为数据链路层反向代理负载均衡。

    这种负载均衡方式的性能很高,因为响应数据不需要经过负载均衡服务,缺点的话也是跟网络层负载均衡的第一种方式一样——后端服务必须与负载均衡服务器处于同一局域网内。

 

  ⑦、IP层反向代理负载均衡之IP隧道

   IP层负载均衡也可以做到像链路层负载均衡那样只转发请求数据,如下所示,后端服务需要配置虚拟IP与负载均衡服务器的IP一致,负载均衡服务收到客户端数据后将其封装到一个新的IP包中,新数据包的源地址是负载均衡自己的IP,目标地址为后端服务的真实地址(根据负载均衡算法选择一台后端服务器),这个数据包通过IP网络路由到后端服务后,通过后端服务器内核的隧道模块(如 ipip)对其拆包,还原出原来的数据包。因为拆包后的原数据包的源IP地址和目的IP地址都没变,且目的IP地址同样为后端服务的虚拟IP地址,所以后端服务的响应数据会直接发送给客户。

    这种封装老的数据包到新的数据包的传输方式叫做“IP 隧道”(IP Tunnel)传输。IP 隧道模式的负载均衡方式的优点就是响应数据不需要经过负载均衡服务,提高了性能,而且IP 隧道工作在网络层,所以可以跨越 VLAN,负载均衡和后端服务不需要在同一个局域网。这种方式的缺点是封装和拆装数据包会降低一些效率,而且后端服务需要启用隧道模块,所以后端服务器必须支持IP隧道协议(几乎所有的现代 Linux 系统都支持 IP 隧道协议)。

  

  ⑧、各负载均衡解决方案对比

  Nginx:支持七层和四层转发来实现负载均衡。
  Haproxy:专业负载均衡软件,与Nginx一样支持七层和四层转发,但性能比Nginx要高。

  LVS:Linux Virtual Server,Linux上的负载均衡技术,使用内核转发(现在LVS已经是 Linux 内核标准的一部分),相比Nginx和HaProxy这种应用实现性能要高很多。其有四种模式:NAT、FULLNAT、IP TUN、DR,分别对应前面所说的“网络层反向代理负载均衡”、“网络层反向代理负载均衡的公网实现”、“IP 隧道模式的负载均衡”、“数据链路层反向代理负载均衡”。linux内核2.6之前的版本中使用LVS的话需要重新编译内核中,2.6之后的LVS已经成为内核的一部分,在linux上使用LVS的话,需要手动安装管理工具(如ipvsadm)来对LVS进行配置和管理。需要注意的是,LVS的FULLNAT模式可能一些linux官方版本不支持(FULLNAT是阿里云、腾讯云等公司开发的内核补丁),可以选择阿里云或腾讯云提供的定制版Linux镜像,或者自行下载内核源码并打上FULLNAT补丁,然后重新编译内核。同nginx一样,LVS也提供了多种负载调度算法,如轮询、加权轮询、最少连接等。LVS所在的服务器是Linux,但后台服务器可以是任何支持TCP/IP的操作系统,包括Linux和Windows。LVS性能虽然比Nginx高,但对于应用的配置灵活性和功能性不如Nginx,比如nginx可配置各种规则对Http请求进行分流,动静分离等,所以可以在LVS后配置多台Nginx来进行一些HTTP自定义操作,然后再是应用服务器。

  Windows Server 内置NBL负载均衡功能:原理和LVS的DR相似,但是相比更加暴力,请求使用广播方式,同一个交换机下RS都将受到请求,RS通过一致性算法确认自己改处理请求还是丢弃请求。

  F5:专业的硬件负载均衡器,价格昂贵。

  ⑨、keepalived

  Keepalived是Linux下一个轻量级的高可用解决方案,起初是专为LVS设计,专门用来监控集群系统中各个服务节点的状态,如果某个服务器节点出现故障,Keepalived检测到后自动将节点从集群系统中剔除。如果使用nginx来搭建负载均衡服务的话,也可以使用keepalived来提供nginx服务的高可用:两台nginx服务A和B,每台都安装Keepalived,它们共用一个虚拟IP(VIP),该虚拟IP为对外的IP,客户端永远只连接这个虚拟IP。设置A为master主节点的话,VIP即绑定到A的真实IP上,客户连接VIP实际上连接的是A。backup备用节点B通过心跳检测主节点健康状态,如果发现主节点故障的话自动绑定VIP到自己网卡上,新的请求会被B节点处理。当原来的主节点恢复后,VIP可能会回到原来的主节点(抢占模式),也可能是原来的主节点成为backup节点(非抢占模式),推荐使用非抢占模式,原来的master恢复后不抢回VIP,防止“脑裂行为”(主备间网络抖动 → 两台均认为对方故障)导致的master频繁切换。

  SLB(Server Load Balancer):阿里云的负载均衡产品家族统称为 SLB(Server Load Balancer),常用的有ALB(App Load Balancer)和NLB(Net Load Balancer),ALB专注于HTTP/HTTPS 等七层应用协议,并且提供丰富的路由功能,NLB适用于TCP/UPD/TCP SSL协议,4层处理能力强大。ALB通过使用Tengine(基于Nginx深度定制)来实现七层负载均衡,使用Keepalived 实现七层负载均衡服务的高可用,使用Tengine的健康检测来提供后端服务的高可用。NLB通过LVS(根据情况选择NAT、FULLNAT、TUN、DR模式)实现四层负载均衡,使用Keepalived 实现四层负载均衡服务的高可用,使用LVS的健康检测来提供后端服务的高可用。

  ⑩、BGP、VPS、云主机、云服务器

  在购买云主机或vps等主机产品时,会涉及到线路选择,而在线路选择中,有时候会看到其中有BGP机房。BGP是边界网关协议(Border Gateway Protocol)的简称,主要用于互联网AS(自治系统)之间的互联。目前BGP的最主要功能在于控制路由的传播和选择最好的路由,以保证网通、电信用户的高速访问。一般的IDC机房分为单线(移动或联通)机房、双线机房(移动和联通)和BGP机房,选择BGP机房可以实现网站在各运营商线路之间实现互联互通,做到使用不同互联运营商(移动、联通、电信)的用户访问你的网站都会很快。

  云主机需要自主安装操作系统,云服务器则预装了操作系统。VPS(Virtual Private Server)是虚拟专用服务的意思,其有自己的独立操作系统,独立ip,但这都是虚拟化的(一台主机被分割成多个VPS来使用)。VPS与云服务器相比的话,虽然二者都是虚拟化产品,但VPS是使用的传统虚拟技术实现的(性能要低),而云服务器是基于云计算技术来实现虚拟化的(性能高),可以把云服务器当成真正服务器对待,其性能比VPS要高,所以VPS适合用来部署小型网站,而且其价格比云服务器要便宜。VPS的另一个缺点是可扩展性不高,如果想要升级VPS的配置的话,可能需要将当前VPS停机一段时间。

4、CDN

  CDN即内容分发网络,其核心理念就是将内容缓存在用户附近来使用,CDN服务就是缓存服务,远端服务的内容会复制一份放到CDN服务上:

   

  下面是DNS域名解析的过程:

  1)用户在浏览器输入www.test.com,浏览器可能会检查自身是否缓存了www.test.com的IP,如果没有的话在本机的C:\Windows\System32\drivers\etc\hosts文件中查找是否有对应IP。

       2)本机host文件里没有的话,会向本地DNS(LocalDNS 通常由ISP网络运营商提供,如 114.114.114.114)发起查询,如果本地DNS的缓存里没有对应记录的话,本地DNS在经过“迭代查询”后获得该域名对应的IP,然后发送给浏览器。

       3)浏览器通过该地址发起请求。

       本地DNS“迭代查询”具体步骤:
  1)LocalDNS向根域名服务器RootDNS(全球共13组)发起查询。
  2)根域名服务器返回查询域名的顶级域(如.com)的服务器地址,然后本地DNS向该顶级域名服务发起查询,顶级域名服务返回查询域名的授权域名服务器(权威DNS服务器)的地址

       3)本地DNS最后向该授权域名服务器发起查询,授权域名服务将查询域名对应的IP地址返回给本地DNS。

   提示:云服务厂商的DNS云解析服务会有一个TTL选项,比如将该TTL设置为60秒的话,修改了域名对应的IP后,LocalDNS最晚会在1分钟后生效。

  

    使用CDN的话,授权域名服务器返回的不是IP地址而是CDN域名服务地址,本地NDS服务收到后会向CND域名服务发起查询,CDN的DNS服务会根据用户IP地址(地理位置)、用户所在运营商网络、边缘节点当前负载情况(负载均衡)等因素选择最优的边缘节点发送给本地DNS服务。浏览器向CDN节点请求数据的时候,如果CDN节点上缓存了数据的话会直接发送给浏览器,没有的话先向实际后台服务请求数据后备份到本服务上然后发送给浏览器。

  

    CDN适用于静态内容(视频、图片等)或半静态内容(html、css、js等),不适用动态的内容,用户动态的实时交互数据是难以缓存的,例如一些频繁修改的数据库表单内容等。

    CDN采用多层级缓存架构,边缘节点L1是最接近用户的缓存服务(部署在接近用户网络出口处,如ISP机房、城域网),父层节点L2是区域缓存中心,处理边缘节点未命中的请求,中心节点是全国缓存中心,处理更复杂的回源需求。当用户请求资源时,CDN会按照"边缘节点→父层节点→中心节点→源站"的路径进行查找,大部分请求在边缘节点即可处理,无需向上层查询。

    CDN缓存命中率包括请求命中率(缓存命中的请求数/所有请求数)和字节命中率(缓存命中响应的字节数/所有请求响应的字节数),新闻、电商、视频点播网站,良好的字节命中率通常在85%-95%之间。当CDN缓存命中率过低时(如低于70%),调整缓存策略,如提高缓存TTL过期时间、首次接入CDN或热门内容或营销活动的话提前推送资源到边缘节点(缓存预热)。

5、网关

    网关Gateway:提供网络数据统一处理和分发功能,其可以在硬件层面和软件层面,比如本机IP设置中的网关为路由器(硬件网关),上面负载均衡实现的第③种方式“应用层反向代理”里,nginx实现了网络数据的七层http转发或四层tcp转发,属于网关功能(软件层面网关),微服务系统一般需要一个API网关来将请求转发给指定的微服务,如Spring Cloud Gateway(软件层面网关),上面负载均衡实现的第④种方式“网络层反向代理负载均衡”里,将负载均衡所在的机器设置为其他机器的网关(操作系统层面网关)。

    进行协议转换功能的服务也可以称作网关,比如https/http安全加速器网关,其对外提供https解密功能,nginx明显属于这种类型的网关:

  

6、HTTP隧道(Web隧道)

   HTTP隧道允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上捎带其他协议数据了,HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层SSL流量。 比如,在一个网络中,为了监听数据,防火墙禁止端口443上的连接,因此该网络中的用户无法访问使用HTTPS协议的服务,使用隧道可以解决该问题:SSL流量被封装到一条HTTP报文中,通过80端口将报文发送出去,服务端提供一个拆解隧道中HTTP报文的代理服务(网关),数据被解封为SSL数据发送给HTTPS服务,如下所示。

image

  隧道协议:客户端通过HTTP协议的CONNECT方法与代理服务器建立TCP连接,代理服务器不解析HTTPS流量内容,仅负责解包和转发HTTPS数据。nginx支持CONNECT请求,所以可以作为隧道的代理服务。

  

  以上内容转载和参考自:代理、网关与隧道,https://blog.csdn.net/sjailjq/article/details/82287345

                                          前端学HTTP之网关、隧道和中继,https://www.cnblogs.com/xiaohuochai/p/6180941.html

posted on 2019-05-21 15:56  整鬼专家  阅读(355)  评论(0)    收藏  举报