本文所述仅针对IIS7.0或更高版本
一、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应用的自动配置。可以通过配置来更新群里面的服务器
如果想做基于IIS的反向代理,用WFF是一个不错的选择。
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,然后单击“添加”。参考: https://docs.microsoft.com/zh-cn/aspnet/web-forms/overview/deployment/configuring-server-environments-for-web-deployment/creating-a-server-farm-with-the-web-farm-framework
- 点击安装。
-
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编号不一致会出现会话状态丢失的问题。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”开头,后面跟任意字符。
其他静态文件的过滤思路与此一致。常见的服务器变量有: 根据IIS提供的服务器变量,可以编写非常复杂的入站条件和入站规则以应对不同的业务场景。5.4 其他功能 5.4.1 缓存 5.4.2 健康检查 5.4.3 负载均衡算法设置 5.4.4 监控 5.4.5 代理 5.4.6 路由 5.4.7 服务器关联(ServerAffinity) 应用程序请求路由提供了客户端相似性功能,该功能在客户端会话持续时间内将客户端映射到应用程序请求路由之后的内容服务器。启用此功能后,负载平衡算法仅适用于来自客户端的第一个请求。从那时起,来自同一客户端的所有后续请求将在客户端会话的持续时间内路由到同一内容服务器。如果内容服务器上的应用程序是有状态的,并且由于会话管理未集中,必须将客户端的请求路由到同一台内容服务器,则此功能很有用。 参考:博客园教程: 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=MSDNIIS大牛博客: 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-nlbhttps://wenku.baidu.com/view/fda62dfa0242a8956bece48b.html