You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量删除IIS网站与应用池导致其他网站无响应问题排查

问题描述

我有一个基于SaaS的网站,部署在IIS上,会为每个客户创建子域名(对应生成一个网站和一个应用池)。我使用以下两个脚本删除了约100个未使用的网站和应用池。起初一切正常,但数小时后大量未被删除的网站开始无响应,且仅通过删除并重新添加网站及应用池才能恢复(回收应用池无效)。请问这些脚本为何会引发该问题?


删除网站的脚本

Import-Module WebAdministration
Get-Website |
Where-Object {
$_.Name -match '(?i)^.+\.siteName.*$' -and
    # Exclusions (case-insensitive via (?i))
    $_.Name -notmatch '(?i)^firstSubdomain' -and
    $_.Name -notmatch '(?i)^secondSubdomain' -and

    $_.Name -notmatch '(?i)^siteName$'
} |
ForEach-Object {
    Write-Host "Removing site: $($_.Name)"
    Remove-Website -Name $_.Name
}

删除应用池的脚本

Import-Module WebAdministration
Get-ChildItem IIS:\AppPools |
Where-Object {
$_.Name -match '(?i)^.+\.siteName.*$' -and
    # Exclusions (case-insensitive)
    $_.Name -notmatch '(?i)^firstSubdomain' -and
    $_.Name -notmatch '(?i)^secondSubdomain' -and

    $_.Name -notmatch '(?i)^siteName$'
} |
ForEach-Object {
    Write-Host "Removing App Pool: $($_.Name)"
    Remove-WebAppPool -Name $_.Name
}

问题根源分析

你的脚本存在三个核心问题,直接导致了后续剩余网站的无响应:

1. 应用池删除逻辑错误,误删在用资源

你按名称批量删除应用池的逻辑,没有验证这些应用池是否还被保留的网站关联。即使网站排除了,但对应的应用池名称如果符合匹配规则,就会被直接删除。当保留的网站请求到来时,IIS找不到配置中指定的应用池,就会陷入无响应状态——回收应用池无法解决,因为目标应用池已经不存在了。

2. 正则匹配的覆盖漏洞

你的匹配规则(?i)^.+\.siteName.*$可能覆盖了部分你想保留的资源。比如如果某个保留子域名的格式是xxx.siteName.yyy,会被正则命中,若排除规则没完全覆盖这类场景,就会误删对应的网站或应用池。后续残留的配置指向已删除的资源,必然引发故障。

3. 批量操作后的IIS配置缓存不一致

一次性删除100个网站和应用池后,IIS的元数据存储(applicationHost.config)可能没有同步更新,或者存在未释放的资源句柄。这些配置错误或资源泄漏不会立刻显现,数小时后累积到一定程度,就会导致剩余网站无法处理请求。而删除并重新添加网站相当于强制刷新了配置缓存,重新分配资源,所以能恢复。


修复建议
  • 调整删除顺序与逻辑:先删除目标网站,再只删除无任何网站关联的应用池,避免误删在用资源。示例脚本:
    Import-Module WebAdministration
    # 获取所有保留网站正在使用的应用池名称
    $usedAppPools = Get-Website | Select-Object -ExpandProperty applicationPool
    # 仅删除未被使用且符合规则的应用池
    Get-ChildItem IIS:\AppPools |
    Where-Object {
        $_.Name -match '(?i)^.+\.siteName.*$' -and
        $_.Name -notin $usedAppPools -and
        $_.Name -notmatch '(?i)^firstSubdomain' -and
        $_.Name -notmatch '(?i)^secondSubdomain' -and
        $_.Name -notmatch '(?i)^siteName$'
    } | ForEach-Object {
        Write-Host "Removing unused App Pool: $($_.Name)"
        Remove-WebAppPool -Name $_.Name
    }
    
  • 添加删除前验证:在删除应用池前,通过Get-Website | Where-Object { $_.applicationPool -eq $_.Name }检查是否有网站关联,确认无关联再执行删除。
  • 批量操作后重启IIS:删除完成后执行Restart-Service W3SVC,强制刷新配置缓存,避免元数据不一致问题。

内容的提问来源于stack exchange,提问作者Ahmed Galal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:42:40