【问题标题】:Server-Specific web.config in website hosted from shared drive从共享驱动器托管的网站中特定于服务器的 web.config
【发布时间】:2009-04-14 18:55:38
【问题描述】:

背景信息:文件复制很糟糕

目前,我们有一个跨 8 个不同 IIS 服务器负载平衡的大型、高流量 ASP.NET Web 应用程序。由于站点的性质,.aspx 文件和 .ascx 控件的微小更改全天经常发生,并且在经过测试和发布后,通过 xcopy 部署定期复制到每个公共网络服务器10 分钟。

当然,这是非常低效的,因为每个服务器都必须拥有整个站点的冗余副本,我们希望消除 10 分钟的发布延迟。

可能的改进:从共享存储托管

我们现在可以选择使用带有 iSCSI 接口的集中式存储来集中托管整个站点,每个服务器都认为远程存储是本地驱动器。发布将是即时的和全系统的。

注意:无法将驱动器从 UNC 共享中托管,因为站点结构中有许多不同的目录,每个目录都需要用于 ASP.NET 的 FileSystemWatcher 来监视更改,因此 SMB 最大命令计数很快就达到了。是的,我们知道 MaxCmds 和 MaxMpxCt 注册表设置。

问题:Web.config 更改触发大量重新编译

我们预见到的问题是,文件系统结构的某些更改可能导致几乎每个已编译的 .aspx 或 .ascx 都必须重新编译,从而导致请求排队和服务器已关闭的感觉。大多数资源并未在系统范围内使用,因此在更改时重新编译它们几乎不会导致资源中断。站点上所有页面使用的全局母版页可能会导致此问题,但这可以通过代码轻松管理。

罪魁祸首是 web.config 文件。对 web.config 文件的更改会导致整个 Web 应用程序循环使用,并进行重新编译。因此,我们目前不复制 web.config 更改。任何 web.config 更改都需要将 Web 服务器从负载平衡器中移除,应用(和测试)更改,然后使用垃圾请求预热服务器,然后再将其放回负载平衡器上。

但是,如果 web.config 文件与 Web 应用程序目录结构的其余部分一样位于集中式存储上,则该文件只有一个副本,并且无法再对各个服务器进行修补和预热。

问题

有没有办法让 ASP.NET Web 应用程序从名为 Web.config 的文件以外的源获取其行进命令?

理想情况下,每台服务器都有一个文件,例如:

  • default.aspx
  • global.asax
  • Web-ServerA.config
  • Web-ServerB.config
  • ...
  • Web-ServerN.config

无论如何,名称“web.config”是在哪里定义的?是否有可以在每台服务器上设置的注册表设置?是否可以在 machine.config 或全局 web.config 中创建条目来指定要使用的文件?

超出范围的事情

我很清楚,我不是在问如何为调试、测试和实时设置不同的 AppSettings。还有其他主题涵盖了这一点,我的所有 web.config 大部分时间都是相同的,唯一需要它们不同的时候是执行更新时。

我们没有将 web.config 用于任何 appSettings 信息;这是针对真正重要的东西,例如程序集引用、httpHandler 定义和其他无法数据库化的 system.web 设置。

更新

我尝试在注册表中搜索 Web.config,除了指出我最近编辑过 web.config 文件的应用程序之外,什么也没找到,我显然做了很多。那里没有帮助。

【问题讨论】:

  • 目前是 IIS6,但升级到 IIS7 是长期计划。在我看来,需要 IIS7 的解决方案就可以了。

标签: asp.net web-config replication load-balancing


【解决方案1】:

我的第一个问题是你在 web.config 中保留了什么?你能把它移到数据库中吗?我们将每个配置设置保存在数据库中的一个表中,并使用 machine.config 来存储数据库连接信息。

不确定对你来说需要多少重写,但它会避免你的问题。

另一种选择是将您的配置项存放在一个外部文件中,并从 web.config 中引用它。在 aspnet wp 被回收之前,不会重新读取对该文件的更改,但允许您更改设置,然后通过 IISRESET 循环每个服务器。

<configuration>
   <appSettings file="OtherFile.config">
...

【讨论】:

  • 这与appSettings无关。这是针对必须在 web.config 文件中的内容,例如程序集引用和 httpHandler 定义。
  • Web.Config 有一个 AppSettings 部分,我相信这是您完成任务所需要的。你忽略了这一点吗?您需要使用 appSettings 部分来解决您的问题。不要重新发明轮子。
【解决方案2】:
  1. 只是好奇,您使用的是什么文件系统? NTFS 不是共享存储文件系统。换句话说,一次不能有多个节点写入文件系统。

  2. 我建议在 IIS 中的站点下使用虚拟目录。这可能需要对代码的布局进行一些重构,但不应该太大。因此,您将拥有站点的根主目录以及特定于该计算机的 web.config,然后将 vdir 映射到您设置的任何共享文件系统资源。

【讨论】:

  • 虽然不是一个完美的解决方案,但实际上可能没有,所以我将其标记为答案。特别是如果可以将最频繁更新的内容归类到特定的虚拟目录,则可以接受一些根目录的复制、很少更改的内容。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多