我们在 IIS 7.5 上遇到了一个问题,我们有一个简单的部署系统,其中包括以下内容:
创建新的 webroot 的 zip 文件,包含三个文件夹:
Api
Site
Manager
它被解压到一个新文件夹(假设我们称之为“SITE_REV1”),并包含一个调用以下命令的脚本(每个 webroot 一个):
C:\Windows\system32\inetsrv\appcmd set vdir "www.site.com/" -physicalPath:"SITE_REV1\Site"
这通常有效,9/10 次。在某些情况下,webroot 似乎已正确更新(如果我检查 IIS 管理器中的基本设置,路径看起来是正确的),但有问题的运行站点实际上指向旧位置。我们设法“修复它”的唯一方法是运行 IIS 重置。回收有问题的应用程序池是不够的。
有时似乎甚至有必要重新启动,但我不能 100% 确定这是否准确(我自己并不总是在解决这个问题)。
我使用 Powershell 和 Web 管理模块重写了脚本,希望是 appcmd 中出现了故障,但还是出现了同样的问题。
Set-ItemProperty "IIS:\Sites\www.site.com" -Name physicalPath -Value "SITE_REV1\Site"
有人经历过这样的事情吗?有人知道发生了什么吗?我可以尝试做些什么来防止这个问题?对我们来说,重置 IIS 并不是一个好选择,因为每次我们尝试在单个站点上部署更改时,这都会影响服务器上的所有站点。
编辑:我们已经确定在 IIS 管理器中启动/停止站点(而不是应用程序池)可以解决错误的物理路径,但如果我使用 appcmd 停止站点,更改物理路径,然后启动它,我仍然会遇到同样的问题。我一片空白……
答案1
从 IIS 管理器更改物理路径是否可以正确且立即生效?
您可能想尝试以下命令。语法不同,应该有相同的结果,但内部工作方式可能略有不同,导致 IIS 能够接受更改(更好):
C:\Windows\System32\inetsrv\appcmd.exe set app "www.site.com/" -[path='/'].physicalPath:"SITE_REV1\Site"
答案2
每个站点的应用程序池回收应该足够了。这些是独立的过程。文章和流程经常提倡使用 iisreset。停止/启动一个站点的应用程序池是一种选择吗?这是一个单服务器解决方案吗?您是否试图最大限度地减少站点的停机时间?有一个选项可以在配置更改时禁用回收。然后您可以手动回收。当问题发生时,applicationHost.config 中列出了什么?