可以同时修改IIS配置吗
Can IIS configuration be modified concurrently
我们在每台服务器上的 IIS 中都有多个网站,我们有 PowerShell 脚本可以 create/update 一个单独的网站,以及配置绑定、SSL、应用程序池等
考虑到服务器场的规模和网站的数量,非常希望能够同时升级一个以上的网站。
但是,这引发了站点 A 的 applicationHost.config 更新可能被站点 B 的并发更新覆盖的问题。
这可能吗?
总是最好测试这个:
让我们从创建一些网站的简单脚本开始,在本例中为 20 个。
Param
(
[Parameter(Mandatory=$true)]
[int]
$offset
)
Import-Module WebAdministration
ForEach ($number in 1..20 ) {
$id = $offset + $number
New-WebSite -Name $("Test_" + $id) -Port $id -Id $id -PhysicalPath "$env:systemdrive\inetpub\wwwroot"
}
我把这个保存到C:\temp\New-TestSite.ps1
现在运行那个脚本同时创建了三个,我创建了另一个脚本:C:\temp\Run-Test.ps1
,内容如下:
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 10000}
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 20000}
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 30000}
在 运行 宁 Run-Test.ps1
之后,让我们检查一下我们创建了多少个站点:
ls iis:\sites | group {$_.Name.substring(0,6)} | Select Count,Name | Format-Table -AutoSize
我得到了:
Count Name
----- ----
19 Test_1
18 Test_2
15 Test_3
所以我们创建了 52 out of 60
当每个脚本创建 50 个时,我得到:
Count Name
----- ----
31 Test_1
31 Test_2
30 Test_3
那是 150 个中的 92 个
在某些测试用例中更糟糕的是,其中一个 PowerShell 进程崩溃了:
至少 Get-Job
显示:
Id Name PSJobTypeName State
36 Job36 BackgroundJob Failed
38 Job38 BackgroundJob Completed
40 Job40 BackgroundJob Completed
所以综上所述,我们可以说并发修改applicationHost.config是不省的。
当然,这是一个极端的测试用例,同时进行手动更改可能会起作用,但我们应该小心。
在 Server 2012 R2 (IIS 8.5) 上测试 运行
我们在每台服务器上的 IIS 中都有多个网站,我们有 PowerShell 脚本可以 create/update 一个单独的网站,以及配置绑定、SSL、应用程序池等
考虑到服务器场的规模和网站的数量,非常希望能够同时升级一个以上的网站。
但是,这引发了站点 A 的 applicationHost.config 更新可能被站点 B 的并发更新覆盖的问题。
这可能吗?
总是最好测试这个:
让我们从创建一些网站的简单脚本开始,在本例中为 20 个。
Param
(
[Parameter(Mandatory=$true)]
[int]
$offset
)
Import-Module WebAdministration
ForEach ($number in 1..20 ) {
$id = $offset + $number
New-WebSite -Name $("Test_" + $id) -Port $id -Id $id -PhysicalPath "$env:systemdrive\inetpub\wwwroot"
}
我把这个保存到C:\temp\New-TestSite.ps1
现在运行那个脚本同时创建了三个,我创建了另一个脚本:C:\temp\Run-Test.ps1
,内容如下:
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 10000}
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 20000}
start-job -ScriptBlock {& C:\temp\New-TestSite.ps1 -offset 30000}
在 运行 宁 Run-Test.ps1
之后,让我们检查一下我们创建了多少个站点:
ls iis:\sites | group {$_.Name.substring(0,6)} | Select Count,Name | Format-Table -AutoSize
我得到了:
Count Name
----- ----
19 Test_1
18 Test_2
15 Test_3
所以我们创建了 52 out of 60
当每个脚本创建 50 个时,我得到:
Count Name
----- ----
31 Test_1
31 Test_2
30 Test_3
那是 150 个中的 92 个
在某些测试用例中更糟糕的是,其中一个 PowerShell 进程崩溃了:
至少 Get-Job
显示:
Id Name PSJobTypeName State
36 Job36 BackgroundJob Failed
38 Job38 BackgroundJob Completed
40 Job40 BackgroundJob Completed
所以综上所述,我们可以说并发修改applicationHost.config是不省的。
当然,这是一个极端的测试用例,同时进行手动更改可能会起作用,但我们应该小心。
在 Server 2012 R2 (IIS 8.5) 上测试 运行