Windows Server 2016 IIS 10.0 安装配置与故障排查实战指南
1. 装之前先把需求理清楚IIS 10.0能干嘛不能干嘛Windows Server 2016 自带的是IIS 10.0和 Windows 10 上的是同一个大版本。经常有人问Server 2016 的 IIS 和 Win10 的 IIS 有什么区别——核心功能基本一致差别主要在角色管理和承载能力上。Server 版的 IIS 可以通过服务器管理器统一纳管支持更多并发连接而且部分高级功能比如 Application Initialization、WebSocket 协议支持在 Server 上是完整的正式版不像 Win10 家庭版那样被裁剪。我见过不少第一次部署的人犯一个共同错误装完之后打开浏览器访问localhost看到 IIS 默认欢迎页就以为万事大吉了结果第二天业务同事说网站打不开才发现防火墙没放行 80 端口。所以这篇文章不只是告诉你下一步下一步我会把从裸机到能跑业务站点的完整链路拆开讲包括图形化安装、PowerShell 批量化安装、装完之后的验证和最小配置以及热搜里那些高频故障的实际排查思路。动手之前先把三个基础问题确认清楚1. 系统版本确认右键此电脑→ 属性确认是 Windows Server 2016 Standard 还是 Datacenter。不同版本对 IIS 的功能支持基本一致区别在虚拟化授权和容器支持上IIS 本身不受影响。但要注意Server Core 模式没有桌面环境的命令行版本和Nano Server安装 IIS 的方式不一样后者甚至不能用图形界面得用 DISM 命令。这篇文章以带桌面体验的完整版为主命令行安装方式我在第 3 节单独讲。2. 磁盘空间和系统分区IIS 核心组件占用的空间不大系统盘留出 2GB 左右就足够。但如果你的网站程序、日志文件、上传目录都放在系统盘建议提前规划好单独的数据盘。尤其要注意默认日志路径在C:\inetpub\logs\LogFiles访问量大的站点日志增长非常快我处理过一次日志把 C 盘塞满导致整个 IIS 服务异常的故障教训深刻。3. 服务器是否加入了域环境域环境下的 IIS 安装完成后应用程序池的标识默认是ApplicationPoolIdentity这个虚拟账户在某些域策略下可能没有读取共享目录的权限提前知道这点能省掉后面排查的很多时间。工作组环境则基本不用操心。确认完这些下面开始真正装。2. 图形化安装服务器管理器里走一遍完整流程2.1 进入添加角色和功能向导登录服务器后打开服务器管理器默认开机自启如果关了可以在开始菜单找到点击右上角的添加角色和功能。这里要注意一个很多人困惑的点向导第一步是安装类型有基于角色或基于功能的安装和远程桌面服务安装两个选项。部署 IIS 选第一个基于角色或基于功能的安装就行。第二部选择目标服务器直接选当前服务器不要在这里创建服务器组那是给多服务器批量管理用的单机部署不需要。接下来就到了关键的角色选择界面。2.2 逐项勾选组件这里决定了你后面少踩多少坑在服务器角色列表中勾选Web 服务器(IIS)。此时会弹出一个对话框提示添加 Web 服务器(IIS) 所需的功能直接点添加功能。这一步完成后左侧列表变成了 Web 服务器(IIS) 展开状态。很多人会直接点下一步直到完成这是最大的坑——默认安装的 IIS 功能非常精简连 ASP.NET、CGI、WebDAV 都不带后面部署应用时各种404.3、500.19错误全是因为功能缺失。我建议按照下面的清单勾选基本能覆盖 90% 的业务场景功能分类建议勾选适用场景常见 HTTP 功能默认全选额外勾选HTTP 重定向做域名跳转、HTTP 跳 HTTPS运行状况和诊断默认全选即可日志和错误页排查用性能功能默认全选可加动态内容压缩接口和 HTML 页面压缩节省带宽安全性默认全选加IP 和域限制后台地址做 IP 白名单应用程序开发ASP.NET 3.5、ASP.NET 4.6、CGI、ISAPI 扩展、ISAPI 筛选器跑老旧系统、PHP、Python 都需要FTP 服务器按需勾选需要开 FTP 的话选上勾选完角色服务后向导会继续到功能页面。这里默认勾选的 .NET Framework 3.5 Features 需要注意Server 2016 安装 .NET 3.5 经常失败因为系统默认不保留 3.5 的安装源需要指定sxs源文件路径或者配置好 Windows Update 源。如果你确实需要 .NET 3.5很多老 PHP 站点、老 .NET 程序依赖它建议提前准备好安装源用不到的话不要勾免得在这里卡半小时。2.3 安装完成后的界面变化点击安装后向导会显示安装进度。正常情况下几分钟完成显示在 Computer 上安装成功并提示关闭。装完之后打开服务器管理器左上角的工具菜单你会看到多出了Internet Information Services (IIS) 管理器和IIS 管理服务两个条目前者就是管理 IIS 的主界面。打开 IIS 管理器左侧连接面板里展开服务器节点能看到应用程序池和网站两个子节点。默认情况下系统已经帮你创建了一个Default Web Site和一个名为DefaultAppPool的应用程序池。你没有做任何配置IIS 已经能跑起来了——访问http://localhost就能看到默认欢迎页。这也是很多人疑惑的地方我还没创建任何网站为什么就有个 Default Web Site这是 IIS 自带的默认站点物理路径在C:\inetpub\wwwroot里面有一个iisstart.htm页面。我的建议是如果这台服务器只跑你自己的业务站点直接把默认站点停掉或者改绑定不要让默认站点占着 80 端口。否则你部署的站点万一绑定的端口或主机名和默认站点冲突启动时会报另一个站点正在使用该端口。3. 用 PowerShell 一把梭适合批量交付和远程操作3.1 一条命令装完核心组件如果你习惯命令行或者服务器是 Server Core 模式加上远程桌面连上去之后发现没有图形界面别慌PowerShell 全都能搞定。打开 PowerShell管理员身份输入下面这条命令Install-WindowsFeature -Name Web-Server -IncludeManagementTools-Name Web-Server对应图形界面里的Web 服务器(IIS)角色-IncludeManagementTools表示同时安装 IIS 管理器等管理工具。装完系统会返回一个表格Success列为 True 就说明成功了。如果还想装上 ASP.NET、CGI 这些子功能命令改成Install-WindowsFeature -Name Web-Server, Web-Asp-Net45, Web-CGI, Web-ISAPI-Ext, Web-ISAPI-Filter -IncludeManagementTools我把常见角色服务的 PowerShell 名称整理成了一张表方便查阅功能图形界面名称PowerShell 名称IIS 核心Web 服务器(IIS)Web-Server管理工具管理工具Web-Mgmt-ToolsASP.NET 4.6ASP.NET 4.6Web-Asp-Net45ASP.NET 3.5ASP.NET 3.5Web-Asp-Net35CGICGIWeb-CGIISAPI 扩展ISAPI 扩展Web-ISAPI-ExtISAPI 筛选器ISAPI 筛选器Web-ISAPI-FilterHTTP 重定向HTTP 重定向Web-Http-Redirect动态内容压缩动态内容压缩Web-Dyn-CompressionIP 和域限制IP 和域限制Web-IP-Security注意Web-Asp-Net35在 Server 2016 上默认无法直接安装成功报错信息通常是请求的功能缺失源文件需要指定源路径即-Source参数指向sxs文件夹。没有安装介质的话最省事的方案是换一台能正常访问 Windows Update 的机器在线安装。3.2 检查安装状态和子功能列表装完之后可以用这条命令验证Get-WindowsFeature Web-Server输出里Install State显示Installed就代表安装成功。想列出 IIS 相关的所有子功能安装情况用Get-WindowsFeature | Where-Object {$_.Name -like Web-*} | Format-Table -AutoSize这个命令在排查为什么我功能没装全的时候特别好用。有一回我远程给客户的 Server Core 服务器装环境自认为命令没问题结果部署时发现 URL 重写模块用不了一查才发现漏了Web-Url-Auth补装就一句话的事。3.3 命令行下的站点管理IIS 装好后用 PowerShell 管理站点也很方便这里给几个常用命令备用# 启动/停止默认站点 Start-Website -Name Default Web Site Stop-Website -Name Default Web Site # 查看本机所有站点 Get-Website # 新建一个指向 D:\web\mysite 的站点绑定 8080 端口 New-Website -Name MySite -PhysicalPath D:\web\mysite -Port 8080命令行安装的优势在批量场景下特别明显。比如你要给 20 台新交付的服务器装同样的环境一台台点图形界面能点到怀疑人生。写个循环脚本几分钟全部搞定。而且脚本本身就是文档下次再交付新机器把之前的脚本拿出来跑一遍就行不会出现当时怎么装的来着这种尴尬。4. 装完先别急着部署第一轮验证与最小化配置4.1 默认站点与物理路径说明打开 IIS 管理器点击网站→ 右键“Default Web Site” → 管理网站 → 浏览会弹出 IE 显示 IIS 默认欢迎页。这个默认页面的物理路径是C:\inetpub\wwwroot。你可以往这个目录丢一个简单的 HTML 文件来验证 IIS 是否正常处理静态文件。比如创建一个test.html内容写Hello IIS浏览器访问http://localhost/test.html能看到内容就说明 IIS 的静态文件处理链路是通的。顺便说一句很多人问为什么我把网站文件丢到 wwwroot 了还是打不开——大概率是默认文档配置的问题。IIS 默认只认index.html、index.htm、Default.htm、Default.aspx这几个文件名。如果你的网站首页叫index.php或者main.html而对应的处理模块如 PHP还没装就会直接返回 404。这个知识点在部署站点时非常高频记一下能省不少时间。4.2 防火墙端口放行与浏览器验证这是整个安装流程里最容易出问题的一环。服务本机访问localhost正常但局域网其他电脑访问http://服务器IP打不开十有八九是防火墙拦住了 80 端口。Server 2016 默认的Windows Defender 防火墙会拦截外部对 80 端口的访问。在服务器上执行以下命令放行New-NetFirewallRule -DisplayName IIS-Web-80 -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow或者走图形界面控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP 80 → 允许连接。放行之后换一台局域网内的电脑浏览器访问http://服务器IP能打开默认页就说明网络链路全通了。这里有一个判断小技巧本机能开、外网打不开通常是防火墙或路由器端口映射问题本机也打不开先看 IIS 服务是否启动再看 80 端口是不是被其他程序占了。查看端口占用用netstat -ano | findstr :80如果发现端口被 PID 4System 进程占用一般是HTTP.sys 内核驱动在监听这是 IIS 的正常表现不是故障不用慌。4.3 一个高频误区装了管理工具不等于装好 IIS前面提过Web-Mgmt-Tools即管理工具和Web-Server核心是分开安装的。有学员问我我服务器上明明有 IIS 管理器为什么访问网站打不开原因是IIS 管理器和 IIS 服务是两个不同的东西。管理工具只是个操作面板你可以装在任何一台机器上用来远程连接管理服务器上的 IIS 服务。但服务本身必须在目标服务器上安装。所以排查网站打不开时第一件事不是看 IIS 管理器而是确认目标服务器上W3SVCWorld Wide Web Publishing Service服务是否在运行Get-Service W3SVC状态为 Running 才说明 IIS 服务器本身正常工作。管理工具安装得再齐全服务器上没有 W3SVC一切都是白搭。5. 热搜问题排查经验权限、访问、运行时组件5.1 应用程序池权限设置失败错误 0x80005000 的血泪排查在热搜词里有一个非常典型的错误请手动为其设置 localsystem 权限未知错误(0x80005000)。这个错误是我处理过的 IIS 问题里出现频率排前三的。错误现象在 IIS 管理器中修改应用程序池的标识为 LocalSystem 或指定账户时点确定直接报错错误码0x80005000。重启应用程序池、重启 IIS 服务都没用。根本原因0x80005000 对应的是COMADMIN_E_ACCESSDENIED本质是权限不足。具体到这个场景是 IIS 管理器inetmgr.exe在修改应用程序池标识时需要写入 IIS 配置存储位于C:\Windows\System32\inetsrv\config而执行修改的账户对配置文件的权限不够或者没有以管理员身份运行 IIS 管理器。排查和修复步骤关闭 IIS 管理器右键图标选择以管理员身份运行。这个操作能解决一半的问题——很多时候你当前登录的账户是普通用户即便加了本地管理员组UAC 提权没做写入配置存储照样被拒。如果以管理员身份运行仍报错检查C:\Windows\System32\inetsrv\config目录的权限。右键目录 → 属性 → 安全确认SYSTEM和Administrators有完全控制权限。还是不行用命令行方式试试绕过 GUI 的 COM 调用Set-ItemProperty -Path IIS:\AppPools\DefaultAppPool -Name processModel.identityType -Value 2其中identityType的值0 是 LocalSystem1 是 LocalService2 是 NetworkService3 是 ApplicationPoolIdentity4 是自定义账户。设置完再回到 IIS 管理器看通常错误已经消失。这个问题的坑点在于错误提示非常有误导性它让你手动设置 LocalSystem 权限但真正处理起来和 LocalSystem 权限根本不沾边纯粹是配置存储写入权限问题。你按提示去找什么 LocalSystem 账户权限方向就错了。5.2 服务器 IIS 网站外网打不开的完整排查链路网站外网打不开在 I/O 运维里是日常高频问题但原因五花八门。我把这些年排查过的案例串成一条链路按顺序查基本都能定位第一步确认内网能不能开局域网内另一台电脑访问http://服务器内网IP。如果打不开问题出在服务器本身——IIS 服务未启动、端口未监听、防火墙拦截这三者的概率最高。依次检查Get-Service W3SVC netstat -ano | findstr :80 Get-NetFirewallRule -DisplayName *IIS*第二步确认路由器端口映射内网能开、外网打不开第二站查路由器的端口映射/虚拟服务器配置。家用路由器通常叫端口映射企业防火墙叫DNAT。检查是否把公网某个端口映射到了服务器的内网 IP 和 80 端口。这里有个容易出错的点运营商封了 80 端口。很多家用宽带的公网 IP 是运营商做了 CGNAT 的共享 IP80 和 443 端口无法从外部访问。验证方法很简单用手机流量访问http://公网IP打不开再换一个非标端口比如 8080映射测试非标端口能开、80 不能开基本就是运营商封端口。第三步检查站点绑定确认 IIS 站点绑定的 IP 地址是全部未分配还是具体某个内网 IP。如果只绑定了内网 IP从外部通过端口映射访问时数据包的目标地址是内网 IP一般没问题但如果你在绑定里填了公网 IP很多新手会犯外部流量到达服务器时目标地址已经被 DNAT 成内网 IP 了和绑定不匹配请求直接失败。第四步排查安全软件拦截360、安全狗、云锁等安全软件可能会拦截 80 端口的入站流量。装了这些的服务器出问题先把安全软件的拦截日志打开看看或者临时关闭测试。我遇到过一次客户服务器装了安全狗后外网访问无故超时查了半天是安全狗的 CC 防护把正常访问拦了。5.3 部署 .NET 8 等新一代运行时要注意什么热搜里有条 iis 中没有 .net8这其实是一个新老技术栈交替时非常典型的困惑。IIS 10.0 的应用程序池默认支持的 .NET CLR 版本是.NET Framework4.0 和 2.0。.NET 8 属于 .NET Core / .NET 5 体系它不再由 IIS 直接托管 CLR而是通过AspNetCoreModuleV2 模块反向代理到 Kestrel 服务器**。这个概念没转过弯的人就会在应用程序池 → .NET CLR 版本下拉列表里拼命找 .NET 8结果找不到就以为 IIS 不支持。正确的部署步骤是在服务器上安装 .NET 8 Hosting BundleASP.NET Core Runtime 托管捆绑包这个安装包会把AspNetCoreModuleV2原生模块注册到 IIS。发布站点时选择框架依赖模式然后把发布文件拷到服务器上的某个物理目录。在 IIS 中新建网站或应用程序应用程序池的.NET CLR 版本选择无托管代码——注意这里不是选 .NET 8而是选 No Managed Code因为实际跑代码的是 KestrelIIS 只负责转发。确认 site 的 web.config 里有 AspNetCore 节点的配置指向你的程序集名称。这一套装完之后IIS 管理器里localhost下会多出一个AspNetCore Module V2的图标图标像两个互相咬合的齿轮。看到它才说明 IIS 和 .NET 8 的对接通道正式打通。5.4 IIS 备份与还原很多人等到出事才想起来的事热搜词里 iis备份与还原 出现频率不低。我负责任地说一句IIS 配置备份是性价比最高的操作没有之一。手误删了一个站点、改错了一个绑定、升级了某个功能模块导致全部站点 500——这些事故还原只需要一分钟但前提是你提前做了备份。IIS 提供了原生的配置备份机制用命令操作非常方便# 创建备份 %windir%\system32\inetsrv\appcmd.exe add backup Backup-20250101 # 查看所有备份 %windir%\system32\inetsrv\appcmd.exe list backup # 还原备份 %windir%\system32\inetsrv\appcmd.exe restore backup Backup-20250101备份文件保存在C:\Windows\System32\inetsrv\backup目录下只备份配置不备份网站内容文件。网站源码、上传文件、日志这些还得单独做文件备份。我在生产服务器上的习惯是每次修改 IIS 配置前先做一次备份命名带上日期和改动摘要比如Backup-20250101-before-https-binding。这样改动出问题回滚起来极其顺手。单独一次配置备份成本几乎为零但关键时刻能救命。另外applicationHost.config是 IIS 的核心配置文件在C:\Windows\System32\inetsrv\config目录下如果你对配置文件熟悉也可以直接定期复制这个文件做备份效果等同于配置级备份。5.5 除了上面这些你可能会马上遇到的三个小问题问题一IIS 管理器添加进度不动在 Server 2019 上装 IIS 时点添加角色和功能进度条卡住不动Server 2016 偶尔也会。这通常不是死机而是 Windows 模块安装服务在处理依赖项时比较慢尤其是涉及 .NET Framework 3.5 的时候。处理方法耐心等 5-10 分钟如果还不动打开C:\Windows\Logs\CBS目录下的 CBS.log 看最后的日志记录确认是否卡在某个组件上。最粗暴的解决办法是重启 Windows Update 服务再装一次。问题二部署的网站访问返回 500.19这个错误码是 IIS 配置错误的万金油错误。最常见的原因是 web.config 里写了网站根目录访问不到的配置节或者物理路径权限不足。排查顺序事件查看器 → Windows 日志 → 应用程序找到对应时间的错误记录里面会详细写出具体是哪个配置节出错。比我在这里猜要准确得多。问题三Unity WebGL 发布后部署到 IIS 总是 404热搜里的 unity 发布web部署iis 对应的是静态文件 MIME 类型问题。Unity WebGL 生成的文件很多是.data、.wasm、.bundle这类 IIS 默认不认识的后缀名IIS 对未知 MIME 类型默认返回 404。解决办法IIS 管理器 → 选中站点 → MIME 类型 → 添加文件扩展名MIME 类型.dataapplication/octet-stream.wasmapplication/wasm.bundleapplication/octet-stream.memapplication/octet-stream加上之后先回收一次应用程序池再刷新浏览器记得清缓存或者强制刷新基本就通了。6. 最后分享几个日常维护的习惯IIS 装好、站点跑起来这只是开始。根据我这两年和 IIS 打交道的经验再分享几个值得长期坚持的小习惯。第一日志和备份要 schedule 自动化。手动做备份最大的问题是会忘。我建议用任务计划程序每天凌晨自动执行一次 appcmd 备份命令备份文件保留最近 7 份即可。代码逻辑不复杂先删旧备份再建新备份两条命令搞定。第二配置改动之前先看一眼当前状态。用appcmd list site和appcmd list apppool先把当前的站点和应用池列表截图或者记下来。很多时候改出问题要回滚结果忘了原来的配置长什么样非常被动。哪怕只是改一个绑定端口也花十秒钟先看一眼现状。第三关于 80 端口被占用的那点事。IIS 默认跑 80但我也遇过服务器上同时装了 Apache、Nginx、Skype 之类抢 80 端口的软件。排查网站起不来的时候先netstat -ano | findstr :80看端口到底被谁占了再决定是改 IIS 绑定端口还是处理占用程序。千万别一上来就卸载别的软件——先搞清事实再动手。第四IIS 的日志是排查问题的第一手资料。站点默认的访问日志在C:\inetpub\logs\LogFiles\W3SVC站点ID下站点 ID 就是 IIS 里站点名称后面的数字。站点打不开的时候除了看事件查看器也翻一下这个目录下最新的日志文件里面记录了所有请求的 HTTP 状态码。状态码 404 是路径问题500 是程序问题503 是应用池繁忙或停止按状态码去排查比瞎猜高效得多。这些习惯花不了多少时间但能让你在服务器出问题的时候从容不少。IIS 本身是一个稳定到甚至有点无聊的组件大部分时间的故障都出在配置和权限上而不是 IIS 自身。把基础的操作逻辑理清楚后面部署和运维的路就能顺很多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →