本文所述仅针对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拓展
  • 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

IIS搭建负载均衡WebFarm+Arr的更多相关文章

  1. Nginx 在windows下配合iis搭建负载均衡过程 [转]

    因为项目遇到大量图片存储问题,虽然现在我们图片还不是很多(目前在1T上下,预计增长速度每年1.3倍的增长速度),自己在思考如何有效地存储大量图片时,查找一些资料,看到了,有人使用 Nginx搭建服务器 ...

  2. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  3. node + nginx + mongo搭建负载均衡

    基于node和nignx和mongo搭建负载均衡 nginx配置: upstream back {                                                  # ...

  4. Nginx-Tomcat搭建负载均衡(转载)

    一.   工具 nginx-1.8.0 apache-tomcat-6.0.33 二.    目标 实现高性能负载均衡的Tomcat集群: 三.    步骤 1.首先下载Nginx,要下载稳定版: 2 ...

  5. asp.net:如何实现负载均衡方案讨论 (nginx+iis实现负载均衡)

    5台阿里云服务器,ip地址分别为 ip地址                      名字简称      操作系统       iis服务器     cpu   内存DDR3      机械硬盘 11 ...

  6. 配置nginx实现windows/iis应用负载均衡(转载)

    配置nginx实现windows/iis应用负载均衡   nginx是俄罗斯人开发的一款跨平台的高性能HTTP和反向代理服务器,可以利用它实现web应用服务器的负载均衡. 反向代理是指将用户请求通过代 ...

  7. 使用 Nginx + Tomcat 搭建负载均衡

    负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance, ...

  8. 160526、高并发之LVS搭建负载均衡

    LVS介绍: LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器.它是我们国家的章文嵩博士的一个开源项目.在linux内核2.6中,它已经成为内核的一部分,在此之前的内 ...

  9. 搭建负载均衡的环境(利用虚拟机上的四台centos)

    以下转载: 准备 l 系统:Centos6  (三台) l 负载均衡:LVS  + keepalived l 服务器1:Http l 服务器2:Http ip配置 1.VIP(virtual ip): ...

随机推荐

  1. 为了控制Bean的加载我使出了这些杀手锏

    故事一: 绝代有佳人,幽居在空谷 美女同学小张,在工作中遇到了烦心事.心情那是破凉破凉的,无法言喻. 故事背景是最近由于需求变动,小张在项目中加入了MQ的集成,刚开始还没什么问题,后面慢慢问题的显露出 ...

  2. 蓝桥杯2015年省赛C/C++大学B组

    1. 奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...

  3. 1.3创建你的第一个Android项目——Android第一行代码(第二版)笔记

    创建HelloWorld项目 如果是第一次,会经过漫长的等待. 启动模拟器 可以用第三方模拟器,也可以用官方集成的 点击后出现如下界面,可创建多个模拟器,如图,我已经创建好了一个,如果你没有,就点击下 ...

  4. 对c语言中static函数的理解

    先看看前两篇博客:个人对头文件的理解.对声明和定义的理解. static 函数只在定义该static函数的cpp中可见,在其他cpp中是不可见的. 举个例子,我建立了一个project,该projec ...

  5. C/C++中的排序和查找

    以下内容来自<C/C++程序设计实用案例教程> 1.排序 1.1使用qsort函数 C/C++库函数提供了快速排序函数qsort(q时quick的简写),需要引入头文件<stdlib ...

  6. k8s系列----一个简单的例子

    本实验来自k8s权威指南 解决访问demo出错,关键是靠https://www.cnblogs.com/neutronman/p/8047547.html此链接下面的某个大神的评论 主要yaml文件 ...

  7. win10双击执行python

    一. 设置py环境 去官网下载Windows x86-64 executable installer安装 安装后会自动配置py的bin路径和pip的路径 Pip用于安装python库的 二. 设置wi ...

  8. 【大白话系列】MySQL 学习总结 之 COMPACT 行格式的设计原理

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.回顾 MySQL 学习总结系列至此已经第七节了. 从大方向:我们已经学习了 MySQL 的架构设计.Inno ...

  9. java设计模式--迪米特法则

    基本介绍 1.一个对象应该对其他对象保持最少的了解 2.类与类关系越密切,耦合度越大 3.迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好.也就是说,对于被依赖的类不管多么复杂,都尽量 ...

  10. bootstrap-table.js 自适应窗体设置

    $(window).resize(function () { $('#dtOrder').bootstrapTable('resetView') })