IIS搭建负载均衡

--- 本文所述仅针对IIS7.0或更高版本

--- 本文中提到的ServerFarm、WebFarm、web农场都是指WFF

一、IIS简介

IIS( Internet Information Services),微软官方Windows平台上面web容器服务。支持http协议和ftp协议,类似于Linux上面的Apache。

IIS和Windows操作系统绑定在一起,安装了windows操作系统也就安装了iis;iis生态高度模块化,本身仅支持部署静态网站,安装相应的拓展程序和补丁包可以拓展iis提供的服务范畴。例如安装aspnet_regiis.exe,即可在IIS中部署asp.net应用程序。iis常用于部署基于DotNet平台和php开发的web程序。

二、负载均衡简介

负载均衡是一种web服务器部署架构,主要为了达到水平扩展服务器和解决服务器单点故障的问题。

三、IIS中负载均衡解决方案-WFF(WebFarmFramework)

    1:web农场简介

WFF是IIS的一个拓展程序,是IIS中负载均衡的解决方案,能够帮助我们轻松实现Web网站的高性能、高可用性,用来在Web服务器群上提供和管理系统,从而使得集群的软件组件安装和配置成为可能,另外它还支持对ASP.NET应用的自动配置。可以通过配置来更新群里面的服务器。另外,也可以做反向代理服务器。

    2:web农场提供的功能

 内容同步:包括应用的同步和平台的同步。应用同步是指在集群内部同步应用程序部署包和配置文件等;平台同步是指在集群中同步web应用程序运行的环境和平台提供的支持组件,保证各个服务器中应用程序的运行环境是一致的。 比如:.NET 4.0 Runtime、PHP、ASP.NET MVC等

         负载均衡。Web Farm内部有多个Web服务器,请求过来以后,会真正的被哪台服务器处理?这需要用到WFF的负载均衡策略。WFF 默认提供了几种策略,WeightedRoundRobin、ServerVariableHash(服务器变量)、QueryStringHash、RequestHash。根据这些策略,可以实现请求的分配

         监控和管理。WFF允许查看当前Web Farm内服务器的运行状况,包括:Web 服务器是否健康、接受了多少请求、每台服务器的总流量是多少。同时还能测试某台服务器是否处于运行状态。另外还允许我们暂时停用某台服务器,请求就不会路由到停用的服务器。

        缓存。对于部分变化不大的内容,可以采用缓存的方式。缓存有两种,内存缓存和磁盘缓存。缓存可以降低网络内部的流量,提高响应速度。严格来说,以上这些功能不是依靠WFF一个工具实现的,而是以WFF为中心的一系列工具实现的,其中包括:Microsoft Web Farm Framework (WFF) 、Web Deployment Tools(WDT)、URL Rewrite、Application Request Route(ARR)、External Cache等小工具。这些工具可以集成在Web Farm中配合工作,也可以单独安装使用。工具多了点儿,不过安装起来不算太麻烦,使用WPI(WebPlatformInstaller)安装WFF的时候会一并安装相关插件。

    3:常见问题

            WFF依赖什么?

                IIS7.0或更高; Microsoft Web Platform Installer,Microsoft Web Deploy

            WFF是否必须使用ARR(application request routing)来实现负载均衡?

                不是的,WFF仅提供集群管理,负载均衡等工作,无法监听客户端请求。

    4:搭建WFF

            1:WFF整体架构

                客户端请求由ControllerServer接收,接收之后会分发给web农场中的SecondaryServers。


                ControllerServer、SecondaryServer服务器需要有相同的体系结构, 如果主服务器是32位计算机,则每个辅助服务器也必须是32位计算机。如果主服务器是64位计算机,则辅助服务器也必须是64位。 ControllerServer、SecondaryServer服务器需要具有相同的操作系统和Service Pack

             2:防火墙设置

                为了使Web Farm Framework组件与服务器场中的服务器通信,必须允许以下程序和功能通过防火墙进行通信:

                * 核心网络

                * 远程管理

            3:安装相关IIS拓展

                * 安装方式一,单个组件安装(不推荐)

                * 安装方式二,使用WPI(WebPlatformInstaller)进行安装(推荐),此方式,会一并安装所需全部依赖插件

下载并安装WPI,地址 https://www.microsoft.com/web/downloads/platform.aspx安装成功之后有两种打开方式,通过Windows应用程序的快捷方式;重启IIS(或重启计算机之后)在IIS中有一个图标。

选择产品选项卡,然后选择服务器。

找到Web Farm Framework 2.0,然后单击“添加”。


点击安装。


            4:创建ServerFarm

                打开IIS管理器,然后在“ 连接”窗格中展开节点。右键单击“ 服务器场”,然后单击“ 创建服务器场”。将启动“ 创建服务器场”向导。

        输入web农场的名字。点击下一步,进行SecondaryServer服务器的配置,如下图。需要按照图中先后顺序配置服务器ip或者域名(ServerAddress可填写局域网ip地址,公网ip地址,域名),以及请求端口。注意,若输入ip之后直接点击“添加”,再去修改端口是无法保存成功的,端口任然是默认的80端口。另外SecondaryServer只可以添加和移除,无法修改,所以若添加服务器的时候端口填写错误了,只能先删除掉,再次重新添加。


        此时,172.18.6.81这个机器就已经添加进来了,配置的http端口为8001,我们点击“确定”。

        在添加完所有的机器之后,ServerFarm中的机器列表如下,至此WebFarm集群已经配置完成。


 四、配置webFarm访问路由--ARR(ApplicationRequestRouting)。

        当前webFarm已经配置成功,多个机器已经组成了集群,但是现在客户端的请求还无法到达SecondaryServers,因为缺少请求的路由。 可以简单的理解为,WebFarm负责提供服务,ARR负责将流量引入到WebFarm。

    1:ARR简介

            ARR是IIS 的一个插件,可以拦截所有访问IIS的http请求,并基于HttpHeader和ServerVariables对请求的下一步去处做出决定。

    2:安装ARR

        *IIS插件的安装,推荐使用WPI

        在使用WPI安装ARR的过程中,会附带安装url重写模块(URLRewriteModule)(若当前IIS未安装url重写)。url重写模块也是IIS的一个插件,可以单独使用,例如用作http请求转发到https。这里是和ARR配合使用,作为ARR的一个核心模块。url重写模块识别客户端请求头信息或者是ARR提供的服务器变量,结合通配符和正则表达式将请求按照一定的规则分发到WebFarm。

五:为站点配置负载均衡

1:准备三台机器

    5.1.1、172.18.8.88:作为ControllerServer,并在此机器上面安装WFF和ARR。在IIS中新建一个站点Leading。


    站点部署包:


 此站点为一个静态网站,部署包中仅一个html文件,

    设置此站点的应用程序池

            *.NET_CLR版本为:无托管代码。创建leading的目的是分发访问此站点的流量,此站点并不提供服务,所以无需程序安装包,也无需启用任何的isapi扩展。


            *回收-固定时间间隔:设置为0。即永远不会回收。此项设置是为了让leading时刻保持活跃状态,一直稳定的运行。鉴于此站点是一个静态站点,个人觉得没有必要对此处的默认设置做更改,但是官方网站是这样建议的。官网说明: https://docs.microsoft.com/zh-cn/iis/extensions/installing-application-request-routing-arr/install-application-request-routing

            *进程模型-闲置超时:设置为0.即永远不闲置。目的:同上。

    尝试访问leading

5.1.2、172.18.6.81:作为SecondaryServer,此机器上面不需要安装WFF和ARR。在IIS中新建一个站点SecondaryServer81。此站点部署包为一个ASP.NET MVC开发的网站。

    站点部署包为:

    部署包的根目录有一个check.txt的文件,里面的内容为:


此站点应用程序池按照常规ASP.NET MVC站点设置。尝试访问此站点。

网站可以正常打开,并且172.18.8.88机器也可以访问到此网站的内容。注意到首页顶部有一个标识,指代此网站是部署在172.18.6.81这台机器上面。

5.1.2、172.18.3.249:作为SecondaryServer,此机器上面不需要安装WFF和ARR。在IIS中新建一个站点SecondaryServer249。此站点部署包为一个ASP.NET MVC开发的网站。

部署包和172.18.6.81上面的一样,只不过首页顶部的标识改成了172.18.3.249。尝试访问:

5.2、为两个SecondaryServer网站配置session服务器。

        5.2.1:为什么要做这一步

            在负载均衡的环境中,用户的请求会分流到不同的服务器,session信息需要集中存储,避免回话丢失需要用户重新登录的问题。若站点不是使用sessin来保存用户会话,可以跳过此步骤。

        5.2.2:设置session服务器

            在172.18.8.88机器(也可以是另外的其他机器)上面开启Asp.NetStateServicee,这是一个windows服务,随DotNetFramework一起安装的。此服务的功能就是管理sessin会话。

        Asp.NetStateServicee此服务默认工作端口是42424,若开启了防火墙,需要配置此端口的出站规则,若未开启防火墙,不予理会。

        要让其他机器可以访问到172.18.8.88上面的Asp.NetStateServicee服务,还需要修改注册表来提供相应的支持。

打开注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters


    AllowRemoteConnection需要设置为1

    Port可以根据需要自行修改,这里保持默认。


5.2.3:修改两个SecondaryServer站点的配置文件,配置session服务器地址。


5.2.4:需要注意的地方

        修改两个SecondaryServer服务器IIS中站点的编号,他们的编号必须一致。状态服务器是使用IIS中的站点编号和Cookie中的SessionId来确定session请求的唯一性。若SecondaryServer站点的IIS编号不一致会出现会话状态丢失的问题。如下图,箭头指向的“22”就是IIS网站编号,是IIS为每一个网站分配的一个唯一id。



5.3、在172.18.8.88上面配置流量分发规则

5.3.1:设置url重写规则,所有访问172.18.8.88的请求都转发到WebFarm中。

打开IIS,在左边连接窗格中,选中根目录,点击右边的url重写。


点击右边的添加规则

在入站规则中选中空白规则

进入到“编辑入站规则”

名称我们设置为:ARR_TestArr_loadbalance

匹配URL--->请求的URL:下拉框选中“与模式匹配”

匹配URL--->使用:下拉框选中“正则表达式”

匹配URL--->模式:填写“.*”

注意:一定要清楚【匹配URL--->模式 】是匹配URL中的哪一部分,假设当前请求的URL地址为https://shiyousan.com/Home/Index?page=1,那么规则模式匹配的部分就是Home/Index, 一定要注意匹配URL的只是路径部分,不包含主机域名部分,也不包含查询字符串。

匹配URL-→忽略大小写:勾选中

条件:当前不做任何修改

服务器变量:不做任何修改

操作--->操作类型:下拉框选中“路由到服务器场”

操作--->操作属性:当选中了“路由到服务器场”之后,操作属性会自动填写,不用任何修改。

操作-→停止处理后续规则:不要勾选。入站规则可以有很多条,若勾选中“停止处理后续规则”,则规则列表中位于此规则下面的规则将不会起作用。

点击右上角的“应用”


此时,入站规则已经设置完毕


尝试访问http://172.18.8.88

通过首页顶部的标识,我们知道此次请求已经分发到了172.18.3.249.

配置WebFarm的时候,负载均衡算法默认的是权重轮询,当再次刷新后,首页标识变成了172.18.3.81。

5.3.2:过滤静态文件,静态文件不做分发

网站所有的商品图片都存放在阿里云nas中,nas是挂在在ControllerServer上面,当用户访问商品图片的时候,该请求不应该分发到SecondaryServer上面。为了实现此要求,在5.3.1的基础上,编辑入站规则的条件。


{URL}:为前文提到的服务器变量,简单来说,服务器变量(ServerVariables)就是IIS内置的一些变量,这些变量由用户请求产生, 提供有关服务器,与客户端的连接以及该连接上的当前请求的信息。变量中的值就是用户http请求头和请求URI的相关信息。此处{URL}服务器变量是指用户请求中的路径部分,不包含域名、端口和查询字符串。

与模式匹配:模式即规则,也就是说{URL}中的值要能够满足正则表达式的规则。

模式(^/Photos/*):这是一个正则表达式,匹配从“/Photos”开头,后面跟任意字符。

其他静态文件的过滤思路与此一致。常见的服务器变量有:

https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms524602%28v=vs.90%29?redirectedfrom=MSDN

根据IIS提供的服务器变量,可以编写非常复杂的入站条件和入站规则以应对不同的业务场景。

参考:

博客园教程: https://www.cnblogs.com/Leo_wl/p/5104006.html

微软官方文档-IIS7的WFF概述: https://docs.microsoft.com/en-us/iis/web-hosting/microsoft-web-farm-framework-20-for-iis-7/overview-of-the-web-farm-framework-20-for-iis

微软官方文档-ASP.NET4企业应用部署简介: https://docs.microsoft.com/zh-cn/aspnet/web-forms/overview/deployment/deploying-web-applications-in-enterprise-scenarios/

微软官方文档-方案:使用IIS服务器构建Web农场: https://docs.microsoft.com/en-us/iis/web-hosting/scenario-build-a-web-farm-with-iis-servers/overview-build-a-web-farm-with-iis-servers

微软官方文档-应用程序请求路由(ARR)概述: https://docs.microsoft.com/en-us/iis/extensions/planning-for-arr/application-request-routing-version-2-overview

微软官方文档-定义和配置应用程序请求路由到Web农场: https://docs.microsoft.com/en-us/iis/extensions/configuring-application-request-routing-arr/define-and-configure-an-application-request-routing-server-farm

详解URL重写插件规则和条件: https://shiyousan.com/post/635654920639643421

详解URL重写插件规则和模式: https://shiyousan.com/post/635659901987610088

微软官方文档-URL重写配置参考: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

使用ARR实现同一台机器IIS和Tomcat共用80端口: https://www.cnblogs.com/aphason/p/4571899.html

微软官方文档-服务器变量: https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms524602(v=vs.90)?redirectedfrom=MSDN

IIS大牛博客: https://blog.lextudio.com/tagged/iis

六、WebFarm高级

    1:内容同步

    2:持续集成

七、使用ARR+NLB搭建高可用服务体系

NLB:NetworkLoadBalancing 群集允许用户把两台或更多的服务器结合起来使用,在客户端看起来就像是一台服务器,进入NBL 群集的连接请求可以分解传送给两个或更多的集群成员.

参考:

https://docs.microsoft.com/zh-cn/iis/extensions/configuring-application-request-routing-arr/achieving-high-availability-and-scalability-arr-and-nlb

https://wenku.baidu.com/view/fda62dfa0242a8956bece48b.html

你可能感兴趣的:(IIS搭建负载均衡)