零停机上传/ IIS中的回滚


17

我不确定这是否是问这个问题的正确方法,但是基本上这是我想做的事情:

1.)将变更集推送到IIS中的站点。
2.)不要打扰用户。
3.)可以轻松回滚。

因此,我知道必须发生一些事情:

1.)进程外会话-处理
2.)进程外缓存-处理

因此仍然存在以下问题:
1.)我如何避免打扰用户?如果我只是将文件上传到bin,则该应用程序会回收并花费10秒钟以上才能恢复在线状态
。2.)我如何轻松回滚?

我在想一种可能的解决方案是在IIS中设置两个站点,一个为公共站点,另一个为私有站点。上载到私人状态并进行热身。预热后,将交换站点。回滚仅需要交换为私有而不上传。

从理论上讲,这听起来不错,但我不确定其机制。有任何想法吗?


@NickatUship:网站托管在仅一台服务器上吗?如果没有,是否有可能增加第二个?
MattB

@NickatUship:另外,您使用的是哪个IIS版本?
MattB

我们可以使用我们的负载均衡器来解决这个问题-没错。我希望能够在服务器本身上做某事-它将对我们的流程更好。我们正在使用
IIS7。– ChickenMilkBomb

我想知道我们是否可以将全局URL重写规则用于零停机时间部署1)将* .domain.com重写为* .arbitrarysiteA.com,这是IIS中的一个应用程序2.)上传至* .arbitrarySiteB.com 3.)对其进行保暖向上4.)将重写切换到* .siteB.com
ChickenMilkBomb

Answers:


29

这是解决该问题的方法-请记住,我之前没有做过,只是一些概念在我的开发环境中进行了测试。您应该能够使用此语言以及您选择的语言中的一些脚本来设置一个非常强大的框架。基本上,我们将设置一个贫民区负载平衡环境,并使用它在新站点和旧站点之间切换。

要进行设置,您将需要:

首先安装ARR。

在IIS中设置3个网站:

  • 可以说,网站1是您的用户实际连接的网站http://192.168.1.1/。这也是ARR网站。只需设置一个指向该目录的空目录,然后将其放入自己的应用程序池即可。按照以下说明将应用程序池设置为不超时。
  • 网站2和3将是实际托管您的内容的网站。这些地址必须位于自己的IP上,并且由于ARR的工作原理,它们必须位于http://192.168.1.2:8080与网站1不同的端口上http://192.168.1.3:8080。它们还应该位于自己的应用程序池中,并指向文件系统上的不同目录(但两个目录通常具有相同的内容)

安装ARR后,IIS管理器中将出现一个名为“服务器场”的新类别-右键单击并创建一个新场。

  • 给它起一个有意义的名字
  • 将Webserver 2和Webserver 3添加为服务器-确保单击“高级设置”按钮,打开“ applicationRequestRouting”类别,并将每个服务器的httpPort更改为8080
  • 完成向导-系统将询问您是否要创建URL重写规则-单击“是”
  • 现在,您有一个服务器场-要完成配置,请转到服务器场并单击“代理配置”按钮-打开“在响应标头中反向重写主机”并应用更改
  • 在IIS管理器中,转到根级别服务器类别,然后单击“ URL重写”按钮,将为您的服务器场创建一个规则
    • 双击规则以进入设置
    • 打开条件框
    • 添加{SERVER_PORT}与8080不匹配的新条件
    • 应用更改

至此,您已经掌握了完成您的请求所需要的基本知识。如果您转到,http://192.168.1.1/则可以从“网站1”或“网站2”获得您的网站,但是存在其他网站将是完全无缝的。

现在,当您要部署应用程序的新版本时,可以做的是:

  • 停止服务器场中的服务器1(在服务器场工具中,转到“监视和管理”,选择一个服务器,然后选择“使服务器不可用”)
  • 将站点的新版本部署到脱机系统
  • 使用备用IP /端口对离线的站点进行热身
  • 使站点再次可供农场使用
  • 对另一台服务器重复该过程

当您谈论要编写所有脚本时,Web部署工具将发挥作用。它非常容易为您的应用程序创建程序包并从命令行进行部署。如果有问题,还可以轻松地回滚该程序包。ARR也可以使用Microsoft.Web.Administrationdll 编写脚本

另一件事-如果您实际使用的是Windows 2008 R2(即IIS 7.5),请看一下应用程序预热模块-它也应该使预热部分更容易执行。


太好了-谢谢马特 +1甚至只是为了降低一切。我将进行调查,然后回到董事会。
ChickenMilkBomb

完美..可能并非万无一失..但应进行调查
万无一失 Vivek Kumbhar 2010年


10

MattB从水里摔了下来。+1我将提供更多详细信息,但我不想接受他的观点。我会补充他的话。

我的设置与他描述的类似,并且效果很好。即使在单个服务器上,ARR也是解决之道。

但是,我要补充两点。

按照Matt的建议创建2个站点。称他们为yoursite.com01和yoursite.com02之类的名称。

创建2个URL重写规则。一种用于www.yourdomain.com,另一种用于staging.yourdomain.com。对于生产,请使用{HTTP_HOST},其值为(^ www.yourdomain.com $)|(yourIP)。(或您喜欢的任何绑定),对于暂存,请使用{HTTP_HOST},其值为(^ staging.yourdomain.com $)。将规则称为yoursite.com和staging.yoursite.com。

将Rule = yoursite.com绑定到site = yoursite.com01,然后将rule = staging.yoursite.com绑定到site = yoursite.com02。

在staging.yoursite.com上设置FTP。

现在,生产流量将流向Rule = staging.yoursite.com和Site = yoursite.com01。陷入相反。

您可以在任何时候进行部署,测试,预联动,让其他人进行测试等。在白天进行此操作并不重要。每次都部署到相同的FTP帐户。非常适合构建服务器。

然后,当您准备上线时,只需进行以下3个更改:-将FTP绑定从yoursite.com02移至yoursite.com01-更改URL重写规则yoursite.com以指向yoursite.com02-更改URL重写规则阶段。 yoursite.com指向yoursite.com01

现在,您可以实现零停机时间,即时切换以及即时回滚功能!

您唯一需要考虑的问题是进程外会话状态。确保状态服务器接受两个站点ID,以便您在交换期间不会丢失会话状态。

另请注意,这仅是Web而非数据库。

要编写脚本,请使用配置编辑器。进行所需的更改,然后单击“生成脚本”。它将为您提供C#,appcmd或AHAdmin代码。

我已经在网站前端放置了几个月来交换实例,但我再也没有回头。与传统部署相比,它使部署如此令人耳目一新。


@Scott-感谢您的跟进,很高兴知道我发布的内容不是一般的疯狂,因为我从未做过。
MattB

在不引起停机的情况下,对URL重写规则进行更改并没有取得很大的成功。对我而言,大多数时间是:对高流量服务器上的URL重写规则进行任何更改,都会使CPU达到100%的时间约为5-10秒,这可能会导致超时和用户的感觉迟钝。
kavun 2015年

1
@kavun是的,这是事实。在最近几年的某些版本更新中,全球范围内的URL重写规则开始导致所有站点的appdomain回收。过去并非如此。因此,如果您在同一服务器上有ASP.NET站点,则可能会产生影响。但是,如果您仅为此目的使用专用的ARR服务器,则appdomain回收的损失很小,您仍然可以使用类似的好的解决方案。
Scott Forsyth-MVP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.