两个应用程序池或一个站点下的根虚拟目录

这可能听起来像一个非常愚蠢的问题,所以让我先说我想达到什么,然后继续我的问题,我如何设想这样的工作。

我试图实现完全无缝部署我们的Web应用程序到IIS(不中断用户或活动连接)。

我设想这个工作的方式是有两个根虚拟目录共享同一个站点。 根目录虚拟目录我的意思是IIS在内部创build并将其分配到每个站点或Web应用程序的根目录; 除了在这里我想有两个这样的根vdirs(每个绑定到自己的应用程序池,但都引用完全相同的应用程序从不同的文件夹)。 在正常的操作过程中,其中一个vdirs将不起作用。

在进行部署时,我会将新代码放到第二个(非活动)vdir所引用的另一个文件夹中,然后将其标记为活动状态。 我想要完成的是让IIS开始发送所有新的连接(请求同一站点)到新的代码,但保持旧的还活着和活动,直到所有剩余的连接到它死了(一些,如file upload,可能会长期运行)。 一旦所有滞留的连接都死掉,旧的vdir / app池将变为非活动状态,而第二个包含新代码的连接将成为唯一活动状态。

我希望这是有道理的。

如果不是这样,我的另一个尝试就是用一个例子来解释它。

--- Web Site ("mysite.com") --- Root VDir#1 (IIS Internal, App Pool: AppPool#1, Virtual Path: /, Physical Path: C:\inetpub\MySite.v1084\). ACTIVE --- Root VDir#2 (IIS Internal, App Pool: AppPool#2, Virtual Path: /, Physical Path: NONE). INACTIVE 

在部署期间,Root VDir#2将变为活动状态,其物理path将变为C:\ inetpub \ MySite.v1085。 这将是默认的vdir IIS将服务于所有新的连接。 一旦根VDir#1的所有活动会话/连接死亡,该变为无效。

是这样的可能吗? 是否有其他的方式来做这样的事情(我知道在IIS中有一些内置负载均衡的forms(“Web Farms”?),但我不太熟悉)。

你提出的build议听起来像一个A / B交换。 ( 类似问题 )

有一个来自Microsoft的IIS插件工具叫做Web Deploy 。 它将自动执行大部分将更新代码部署到IIS中的物理动作,但无缝迁移的要求是一个棘手的问题,因为您有长期运行的文件事务。 处理这个问题的最好方法是获得一个负载均衡器,同时运行两个网站生产实例,另一个负责登台更新。

(顺便说一句,Azure正在用“云服务”做这样的事情 – 有一个“交换”命令来做这件事情。)

回到你的特定设置,考虑这个configuration:

一个IIS机器,两个网站。 网站A和网站B.他们不指向相同的文件。 他们有自己的文件夹。 网站A在线并为生产中的用户提供服务,而网站B处于离线状态。 准备好更新时,更新Web站点B,然后交换On / Off网站A.现在B已联机,A处于脱机状态。 这是A / B轮换。 稍后,当您执行下一次更新时,您更新A,然后用B交换开/关。现在A在线,B在线。

那一刻,当你交换时,就有可能失去stream量 – (你可能会杀死这些文件传输),但是如果你的应用的音量很低,也许没有人会注意到(你决定)。 但是,如果这是关键任务,高容量,站点 – 获取负载平衡器,并像其他人所描述的那样使用它。

WebDeploy不能做什么,(据我所知)是交换站点A和站点B.为此,你需要编写一个脚本,并在命令行执行

Web Deploy +脚本的好处是,您可以最终实现自动化,并将其绑定到持续部署系统中。

长时间运行的文件传输可能无法通过此设置保存。 另一个挑战是应用程序的任何内存状态。 如果您的networking应用程序是使用内存数据devise的,那么当您执行A / B交换时,您将会丢失它。 如果程序员正在使用会话,您可能可以打开会话服务。 会话数据将不会与应用程序的其余部分处于相同的过程中,并可能在A / B交换中存活。 与程序员讨论应用程序如何pipe理内存数据。 也许它实际上没有任何。 也许它可以很容易地重新创build应用程序重新加载 – (例如重build从数据库caching)