如何在零停机时间下部署ASP.NET应用程序

135
为了部署我们的网站新版本,我们需要执行以下步骤:
  1. 将新代码压缩成zip文件,并上传至服务器。
  2. 在生产服务器上,删除IIS网站目录中所有现有的代码。
  3. 将新代码zip文件解压到现在为空的IIS目录中。
这个过程已经被脚本化,执行速度相当快,但是在删除旧文件和部署新文件的过程中,仍然可能会出现10-20秒的停机时间。
是否有任何建议可以实现0秒停机的方法?

这个问题不应该在ServerFault上吗? - Daniel Rodriguez
52
也许是这样,但是 ServerFault 在2008年9月还不存在。 - Karl Glennon
3
IIS可以指向符号链接文件夹吗?更改符号链接是否会导致IIS进程重新启动? - Neil McGuigan
有没有完整的源代码样例来作为最终解决方案? - Kiquenet
有没有可能拥有多个应用程序池,并将流量从一个应用程序池切换到另一个? - Luke
13个回答

0

我经常使用的无需停机的解决方法是:

  1. 将正在运行的.NET Core应用程序dll重命名为filename.dll.backup

  2. 上传新的.dll(在上传文件时,Web应用程序仍然可用并提供请求)

  3. 上传完成后,重新启动应用程序池。需要RDP访问服务器或在您的托管控制面板中使用函数来重新启动应用程序池。

IIS在回收时重叠应用程序池,因此通常不会有任何停机时间。因此,请求仍然进入,而不知道应用程序池已被回收,并且请求可以无缝地服务,没有停机时间。

我仍在寻找比这更好的方法..!! :)


0

IIS/Windows

在尝试了所有可能的解决方案后,我们使用了这个非常简单的技巧:

  1. IIS应用程序指向一个名为/app的文件夹,该文件夹是指向/app_green符号链接(!)
  2. 我们将应用程序部署到/app_blue
  3. 我们更改符号链接以指向/app_blue(应用程序继续工作)
  4. 我们回收应用程序池

零停机时间,但应用程序会卡顿3-5秒钟(JIT编译和其他初始化任务)

有人称其为“穷人版蓝绿部署”(没有负载均衡器)。

Nginx/linux

在nginx/linux上,我们使用“正确”的蓝绿部署:

  1. nginx反向代理指向localhost:3000
  2. 我们部署到localhost:3001
  3. 预热localhost:3001
  4. 切换反向代理
  5. 关闭localhost:3000

(或使用docker)

使用PowerShell/Bash脚本可以轻松自动化Windows和Linux解决方案,并通过Github Actions或类似的CD/CI引擎调用。


对于 Linux 和 Windows,如果服务使用 EF Core,数据库连接和迁移是如何处理的? - HendrikKoelbel

-8
我建议保留旧文件并简单地覆盖它们。这样,停机时间仅限于单个文件覆盖时间,并且每次只有一个文件丢失。
不确定这是否对“Web应用程序”有帮助(我认为您是在说这就是您正在使用的),这就是为什么我们总是使用“网站”。此外,在“网站”上部署不会重新启动您的站点并删除所有用户会话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接