IIS的配置数据库,IIS6版本是独立metabase文件,升级到IIS7之后改为XML格式文件 applicationHost.config,存放路径 C:WindowsSystem32inetsrvconfig。版本变化,但作用不变,IIS所有站点、应用程序池、绑定规则、模块配置都保存在这里。这个文件一旦损坏,IIS无法启动,站点配置全部错乱。下面梳理常见故障。
访问配置数据库失败,最常见的原因是权限
IIS启动阶段读取 applicationHost.config,运行时各个工作进程同样读取该文件。如果 C:inetpub 或者 C:WindowsSystem32inetsrvconfig 目录权限被改动,IIS读取配置失败,提示访问IIS元数据库失败或者配置注册表数据库损坏。修复方法是文件夹属性里添加 IIS_IUSRS、NETWORK SERVICE、IUSR 账户读取权限,执行 iisreset 重启服务。部分教程会使用 aspnet_regiis -i 重新注册ASP.NET,这条命令解决ASP.NET和IIS注册关系,和文件权限不属于同一类问题,但两类故障有可能同时出现,可以一并处理。

应用程序池连不上数据库,九成是身份没配对
IIS托管网站,默认以应用程序池身份访问数据库。应用程序池默认账户是 ApplicationPoolIdentity,在SQL Server识别为 IIS APPPOOL你的池名称 这类Windows账户。SSMS内没有创建该账户登录名,或者没有分配目标数据库访问权限,就会弹出登录失败提示。解决办法在SSMS新建该账户登录名,数据库内创建用户,分配 db_owner 角色。数据库和IIS分属两台服务器,需要使用域账户,本地账户无法跨机器访问。
连接字符串本身写错了,也会造成一样的症状
web.config 的 connectionStrings 节点,服务器地址、数据库名称、账号密码、加密参数任意一项错误都会连接失败。容易忽略的参数 TrustServerCertificate=True,数据库开启强制加密,客户端没有信任证书,连接请求直接失败。排查时把连接字符串内容输出日志核对,确认和SSMS手动连接使用参数一致。
配置数据库本身损坏了,就得靠备份往回恢复
applicationHost.config 属于XML文件,正常情况下不容易损坏,断电、异常关机、磁盘故障有可能破坏文件。IIS自带配置备份机制,IIS7开始自动保存最近配置快照到 C:inetpubhistory,一般保留十个版本。恢复操作使用 appcmd 命令。先切换目录 cd C:WindowsSystem32inetsrv,appcmd list backup 查询全部备份,选择最近备份执行 appcmd restore backup 备份名称。IIS管理器可正常打开,右键服务器节点,选择备份/还原配置,效果相同。
主动做备份比出了问题再找备份重要
IIS7以上版本执行 appcmd add backup "备份名称",手动创建配置备份,备份文件保存在 %windir%system32inetsrvbackup,只保存配置快照,不包含网站业务文件。修改配置前执行备份属于基础操作,很多人修改出错之后才想起这个功能。
配置迁移到新服务器,不能直接复制粘贴
IIS配置跨服务器迁移,直接拷贝 applicationHost.config 大概率报错,文件内包含原计算机名称、证书指纹、专属路径。稳妥方案是新服务器装好IIS,通过 appcmd 重建站点与应用程序池,或者使用Web Deploy工具迁移。IIS6的metabase.xml,微软官方文档明确禁止旧备份直接恢复到重装后的IIS,文件内存在AdminACL这类绑定本机的标签。
C:inetpubtempappPools 里的临时文件有时候是罪魁祸首
应用程序池运行时,IIS在 C:inetpubtempappPools 生成临时配置与锁文件。旧文件残留,和新配置产生冲突,会报读取配置数据出错或者权限不足。处理方式清空该目录全部文件,执行 iisreset。操作不会改动站点配置,只清理运行缓存。
日志是最好的线索
IIS配置数据库故障,事件查看器的Windows日志-应用程序、应用程序和服务日志-Microsoft-Windows-IIS-Configuration会记录信息。错误代码、配置文件路径、出错账户信息都有记录。找不到故障根源,优先查看这两处近期报错,比全网检索效率更高。