--- 本文所述仅针对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)进行安装(推荐),此方式,会一并安装所需全部依赖插件
选择产品选项卡,然后选择服务器。
找到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_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters
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(v=vs.90)?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 群集的连接请求可以分解传送给两个或更多的集群成员.
参考: