首页 / 资讯中心 / 文章详情

IIS网站发布从零到实战:安装部署、应用池配置与常见报错排查

IIS网站发布从零到实战:安装部署、应用池配置与常见报错排查 ★ FEATURED ARTICLE
这几天帮一个朋友部署内网管理系统他把一台Windows Server 2019从买回来就一直闲置现在要建一个公司内部用的Web系统。我原本觉得IIS部署是再基础不过的事结果从安装到发布再到外网访问一路踩了不少坑——有版本兼容、权限配置、应用程序池隔离还有.NET 8在IIS里的托管方式。晚上把整个过程复盘了一下决定写一篇尽量完整的实操记录从零开始跑通IIS网站发布把那些报错和排查链路也一并写清楚。如果你正准备在自己电脑或服务器上搭建一个IIS网站或者已经装了IIS但发布后各种打不开这篇文章应该能帮你省掉不少折腾时间。1. 别急着动手IIS部署前先想清楚这几件事很多人装IIS之前根本没想过为什么要用IIS这个问题直接跑到启用或关闭Windows功能里把Internet Information Services勾上结果装完发现缺这缺那或者部署方式完全不对路。我建议先花10分钟想清楚以下几个问题后面会少走一半弯路。1.1 IIS在Windows生态里的定位IISInternet Information Services是微软官方出品、集成在Windows Server和Windows桌面系统里的Web服务器组件。它最大的优势就是和Windows系统的深度融合用Windows账户体系做身份认证、用事件查看器做日志、用PowerShell做自动化管理这些都不需要额外装东西。在中小企业内部系统、学校教学环境、Windows技术栈的Web项目里IIS仍然是非常主流的选择。有个反直觉的点虽然现在的开发热点都在LinuxDocker那一套但Windows环境里部署网站IIS往往比Nginx更方便。因为IIS的应用程序池自带进程隔离、回收、权限绑定这些在Windows下手动折腾Nginx反而更费劲。尤其是公司内部有大量.NET项目、老旧的ASP.NET应用IIS几乎是唯一合理的选择。1.2 哪些项目适合上IIS哪些场景建议绕开根据我这几年接触过的项目整理了一下项目类型是否推荐IIS原因ASP.NET / .NET Core 应用强烈推荐原生支持托管配置成熟静态网站 / 前端项目推荐配置简单性能足够Unity WebGL 发布推荐补几个MIME即可外网访问方便高并发API服务看情况中小并发没问题特大并发建议前置Nginx大数据计算 / 微服务集群不推荐偏离IIS定位容器化更合适简单的文件共享/下载站可以用但更推荐直接开共享或FTP说白了IIS最适合的是Windows服务器上的Web应用托管这个场景别拿它跟K8s比也别在Linux上纠结为什么装不了IIS。1.3 版本和兼容性部署前必须确认这是最常见的翻车点。IIS版本跟Windows版本强绑定Windows 10/11跑的是IIS 10Windows Server 2016也是IIS 10Server 2019/2022同样是IIS 10。区别在于Server版本功能更全。确认一下你的应用需要什么运行时经典ASPIIS自带需要在应用程序开发功能里勾选ASP。ASP.NET 4.x需要在功能里勾选部署时应用池选择.NET CLR版本。.NET Core / .NET 5 / .NET 8不需要在IIS功能里勾选什么但服务器上必须装对应的.NET Hosting Bundle。注意IIS管理器里是看不到.NET 8的选项的这不是你装错了而是它的托管方式跟老ASP.NET完全不同。1.4 容易被忽略的准备工作动手安装之前建议先把下面几件事确认好系统管理员权限安装IIS和修改配置都需要管理员权限普通用户会卡在各种权限报错上。磁盘空间系统盘至少留5GB以上IIS本身不大但日志、备份、站点文件都会占空间。端口规划默认80端口会不会被占用如果跑多个站点端口号和主机名怎么分配提前规划好。防火墙策略Windows防火墙默认放行80端口但如果你用了自定义端口必须手动加规则。域名和证书如果以后要上HTTPS现在就得想好证书方案——自签名证书还是申请正式证书这会影响绑定配置。2. IIS安装三条路线怎么选漏掉哪个后面会折腾IIS的安装方式有好几种很多人只知道控制面板那一条路实际上不同场景有更合适的方案。2.1 图形界面安装控制面板和服务器管理器Windows 10/11桌面系统按Win R输入optionalfeatures回车或者从控制面板进入启用或关闭Windows功能找到Internet Information Services勾选。这里要重点说勾选明细很多人只勾了顶层导致后面缺功能。建议按这个清单勾Internet Information ServicesWeb管理工具IIS管理控制台必选IIS 6管理兼容性部分老工具需要万维网服务常见HTTP功能静态内容必选默认文档必选HTTP错误必选目录浏览建议勾上排错方便应用程序开发功能ASP.NET 4.8老项目需要ASP老系统需要CGI某些第三方组件需要运行状况和诊断HTTP日志必选请求监视排错利器安全性基本身份验证、Windows身份验证按需Windows Server系统则从服务器管理器 - 添加角色和功能进入勾选Web服务器(IIS)然后按向导勾选子功能。Server 2019/2022在添加功能时容易卡在进度不动的情况我后面专门讲。2.2 PowerShell批量安装Server Core和批量环境的神器如果你管理多台服务器或者在Server Core这种没有图形界面的环境里用PowerShell装IIS效率高很多。一条命令的事Install-WindowsFeature -Name Web-Server -IncludeManagementTools要装更全的功能可以指定多个名称Install-WindowsFeature Web-Server,Web-Mgmt-Console,Web-Asp-Net45,Web-Static-Content,Web-Http-Logging -IncludeManagementTools装完确认一下状态Get-WindowsFeature Web-Server | Select-Object Name, InstallState本地开发环境如果想快速装IIS也可以用Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole, IIS-ManagementConsole不过我个人建议还是图形界面勾一下至少能看到自己装了哪些东西。2.3 装完IIS后第一时间要做的检查安装完成后不要急着部署先做三个基础检查浏览器访问http://localhost看到IIS默认欢迎页说明Web服务器本身没问题。打开IIS管理器确认左侧连接树里能看到应用程序池和网站节点。事件查看器里确认没有IIS相关的错误日志。如果localhost打不开检查World Wide Web服务是否启动了打开服务管理器找到W3SVC看状态。2.4 Server 2019添加进度不动、Win11找不到IIS管理器的处理这两个问题在热搜里出现频率很高我都实际遇到过。Server 2019添加功能进度不动多数情况下是Windows Modules Installer服务被禁用或系统更新挂起导致的。先打开服务管理器找到Windows Modules Installer服务名TrustedInstaller确认不是禁用状态。如果还是不动运行dism /online /cleanup-image /restorehealth清理系统映像或者重启再试。还有一次我发现是磁盘空间只剩几百MB功能角本一直解压失败清完空间就好了。Win11找不到IIS管理器Win11的家庭版是不带完整IIS管理控制台的只有专业版、企业版、教育版才有。如果你在Windows功能里根本看不到Internet Information Services这个选项大概率是系统版本问题。可以用Win R输入winver确认版本。专业版里如果还看不到试试optionalfeatures命令直接打开功能列表。3. 网站发布完整实操从静态站到.NET 8应用IIS装好之后最核心的就是网站发布这一步。我把整个过程拆开讲每个步骤的作用和理由都说明白。3.1 站点文件该放在哪很多人图省事直接把网站文件丢在C盘inetpub\wwwroot这在测试环境没问题生产环境我不建议。原因有三个系统盘故障会导致网站和系统一起挂。日志和站点文件混在一起备份恢复麻烦。权限隔离不好做。我习惯的做法是在单独的数据盘建目录比如D:\WebSites\myapp。如果是只有一个C盘的服务器至少建一个C:\Websites目录别用默认的wwwroot。文件存放位置的权限也要注意IIS应用程序池账户默认有读取权限但如果你用了自定义账户要手动给目录加权限。后面权限部分详细说。3.2 创建网站和配置绑定打开IIS管理器右键网站选择添加网站有三个核心配置项网站名称只是个标识随意起但建议跟项目对应方便管理。物理路径选到你的站点文件目录。绑定类型这决定了用户怎么访问你的网站。绑定项作用示例类型HTTP还是HTTPShttp / httpsIP地址监听哪个IP全部未分配表示所有IP全部未分配端口访问端口80 / 8080主机名域名绑定不填则IP访问www.example.com这里有个容易混淆的点主机名不填的情况下这个站点会响应所有指向该IP和端口的请求。如果同一台服务器上要部署多个网站必须用不同的端口或者不同的主机名区分。比如你要跑两个站点一个是http://192.168.1.100:8080另一个是http://192.168.1.100:8081端口区分就行。如果都用80端口就得用主机名区分并且要在DNS里把域名解析到这台服务器。3.3 应用程序池IIS稳定运行的核心创建网站的同时IIS会默认创建一个同名的应用程序池。很多人忽略应用程序池配置导致后续各种莫名其妙的问题。应用程序池本质上是网站的进程隔离容器每个池里的网站跑在独立的w3wp.exe进程里。好处是一个网站挂了不影响其他网站不同网站可以用不同版本的.NET运行时。配置要点.NET CLR版本老ASP.NET项目选.NET CLR版本里对应的4.0版本纯静态网站或.NET Core应用选无托管代码。托管管道模式经典模式用于老项目兼容集成模式性能更好新项目推荐集成。启动模式AlwaysRunning可以让应用池常驻避免首次访问慢。闲置超时默认20分钟回收空闲进程如果有长连接需求可以改成0永不超时。测试环境图省事可以全默认生产环境建议至少把启动模式改成始终运行把闲置超时改成0不然半夜没人访问早上第一拨用户访问会明显卡一下。3.4 .NET 8应用在IIS里的托管配置这是现在问得最多的问题很多人在IIS管理器里找不到.NET 8的选项怀疑是不是版本不对。先说明原理IIS托管.NET Core/.NET 5应用的方式跟老ASP.NET完全不同。老ASP.NET是直接由IIS进程加载CLR所以在IIS管理器里能看到.NET CLR版本选项。而.NET 8应用是独立进程IIS通过一个名为aspNetCore的模块把请求转发给应用自己启动的Kestrel服务器这就是所谓的反向代理托管。所以正确的操作是在服务器上安装.NET 8 Hosting Bundle。去微软官网下载安装包叫dotnet-hosting-8.x.x-win.exe。不装这个IIS转发不了请求。发布应用。在Visual Studio里右键项目选择发布目标选文件夹生成后把整个发布目录复制到服务器的站点目录。确认web.config内容。.NET 8项目发布后会自动生成web.config里面有一段核心配置configuration location path. inheritInChildApplicationsfalse system.webServer handlers add nameaspNetCore path* verb* modulesAspNetCoreModuleV2 resourceTypeUnspecified / /handlers aspNetCore processPathdotnet arguments.\MyApp.dll stdoutLogEnabledfalse stdoutLogFile.\logs\stdout hostingModelinprocess / /system.webServer /location /configurationhostingModelinprocess表示进程内托管性能更好.NET 8默认就是用这个模式。应用程序池的.NET CLR版本选择无托管代码管道模式保持集成。经常有人漏装Hosting Bundle结果发布后访问报502.5进程启动失败这是很典型的症状。还有一种情况是服务器装了Hosting Bundle但IIS没重启装完记得在命令行执行iisreset重启IIS。3.5 部署完成的验证步骤部署完别急着关浏览器按这个顺序验证本机访问http://localhost确认网站能打开。查看应用池进程是否正常运行任务管理器里应该有w3wp.exe。看事件查看器确认没有错误日志。用另一台电脑访问http://服务器IP确认局域网内能通。如果站点文件有修改测试更新后是否需要重启应用池静态文件不需要程序集DLL需要。4. 发布后频繁翻车的现场常见报错与完整排查链路部署只是开始真正让人头大的是发布后各种打不开。把几个最常遇到的报错拿出来讲讲每个我都给出完整的排查思路而不是直接丢答案。4.1 HTTP 403.14——目录浏览被禁止这个报错的样子是Web 服务器被配置为不列出此目录的内容。原因是站点根目录下没有默认文档default.htm、index.html等而IIS又默认禁止目录浏览。排查链路先看站点根目录下到底有没有首页文件。很多前端项目构建后入口文件叫index.html这个没问题。但如果入口是home.htmlIIS默认文档列表里没有它就会报403.14。双击IIS管理器里的默认文档点右侧添加把入口文件名加上。如果实在不知道首页叫什么或者就是想让访问者看到目录列表可以启用目录浏览但生产环境不建议会暴露文件结构。实际中我遇到最多的是把Vue/React打包后的dist目录直接扔到站点里但dist里的index.html在子目录下或者忘了IIS的静态内容功能没装。先确认静态内容功能装了再处理默认文档。4.2 HTTP 500.19——配置文件读取失败这个报错通常会带一个配置文件路径最常见的是指向applicationHost.config或站点的web.config。原因多半是IIS进程账户没有权限读取配置文件。让我用一个实际案例还原排查过程。之前帮同事解决一个问题网站放上去后访问报500.19错误提示无法读取配置节 system.webServer/rewrite配置文件路径指向网站的web.config。排查步骤打开web.config发现里面有rewrite节点的配置但服务器IIS没有安装URL Rewrite模块。这个模块需要单独下载安装不在IIS默认功能里。安装URL Rewrite模块后问题解决。另一个常见原因是文件权限。如果web.config文件是从别的电脑复制过来的可能继承了奇怪的ACL权限右键文件属性 - 安全确认IIS_IUSRS组有读取权限。4.3 HTTP 502.5——进程启动失败这个报错在.NET Core/.NET 8部署里太经典了。症状是访问网站返回HTTP Error 502.5 - Process Failure。我的排查链路先确认Hosting Bundle装了没有。这是第一大原因。如果装了还是502.5看事件查看器里的.NET运行时错误通常能找到具体的异常信息。检查web.config里的processPath和arguments是否正确。如果应用DLL名字改了但web.config没同步就会启动失败。在web.config的aspNetCore节点里把stdoutLogEnabled改成true然后重启应用池、刷新页面再到项目目录下的logs文件夹里看stdout日志。这个方法能覆盖大多数排查盲区。应用池的加载用户配置文件这个属性也可能会影响如果系统环境变量特别复杂在应用池高级设置里把它设为True试试。4.4 Unity WebGL发布到IIS需要补MIME类型Unity WebGL发布到IIS很常见但很多人部署后发现.wasm、.data这些文件加载不出来页面白屏或卡在加载进度。原因是IIS不认识这些新文件类型默认当作未知类型处理。解决办法在IIS管理器中选中站点双击MIME类型添加以下几项扩展名MIME类型.wasmapplication/wasm.dataapplication/octet-stream.memapplication/octet-stream.bundleapplication/octet-stream.unitywebapplication/octet-stream另外Unity WebGL还需要服务器支持Content-Encoding: gzip或br如果发布时勾选了压缩选项IIS的动态内容压缩和静态内容压缩建议都装上。还需要注意一个坑Unity WebGL使用fetch加载资源所以必须在web.config里确认为OPTIONS请求返回正确的CORS头尤其当你把WebGL站和API站放在不同端口/域名下。4.5 外网访问不了从端口到防火墙的完整检查顺序服务器IIS网站外网打不开是出现频率最高的搜索词之一这个问题往往不是IIS本身的问题而是网络链路的问题。我按从里到外的顺序排查IIS本机是否能访问服务器上访问http://localhost打不开先解决IIS本身。局域网是否能访问换一台同网段的电脑访问http://服务器内网IP打不开检查IIS绑定IP是否正确、Windows防火墙是否拦截。公网IP是否能通如果有公网IP或做了端口映射从外网访问http://公网IP打不开就要检查路由器的端口映射、运营商是否封了80端口。防火墙规则Windows防火墙默认放行80端口但你若用了8080等自定义端口必须在防火墙高级设置里添加入站规则。有些安全软件也会拦截。绑定检查站点的IP地址绑定如果设置了具体内网IP而外网映射指向的是另一个IP就会导致访问不到。排查用的命令很重要telnet 公网IP 端口和Test-NetConnection -ComputerName 公网IP -Port 80PowerShell可以判断端口通不通。5. 应用程序池和权限设置决定IIS能不能长期稳定跑很多人的IIS刚部署好没问题跑一段时间就开始出现卡死、无响应、报权限错误这十有八九是应用程序池和权限设置没做对。5.1 为什么强烈建议一个站点一个应用池默认情况下每个网站会创建自己的应用池但有些新手为了图省事把多个网站手动指定到同一个应用池。这会带来两个问题进程隔离失效一个网站崩溃会导致同池所有网站跟着挂。配置互相影响不同网站的运行时版本、回收策略没法独立设置。我的经验是多花30秒给每个网站建一个独立应用池后面省心很多。特别是给客户部署的系统宁可多占一点内存也要保证一个站挂了不影响其他站。5.2 权限设置失败报0x80005000的完整处理这个报错值得单独拎出来讲。提错误描述是请手动为其设置LocalSystem权限未知错误(0x80005000)我查了一下遇到过这个问题的同行不在少数。先说我遇到的一种场景在IIS管理器的应用程序池高级设置里修改进程模型账户从ApplicationPoolIdentity改成LocalSystem或指定用户时弹出了这个错误。排查链路复制完整错误信息定位到配置文件。多数情况下错误里会带一个路径比如C:\Windows\System32\inetsrv\config\applicationHost.config。用管理员身份打开PowerShell尝试直接编辑配置文件看是否能保存。如果提示权限不足说明配置文件本身没问题是IIS管理器操作时的权限上下文不对。检查IIS管理器的运行身份。很多情况下IIS管理器虽然打开了但Windows的用户账户控制UAC没提权或者当前账户不在管理员组导致修改Global配置失败。先关掉IIS管理器右键以管理员身份运行再试一次。如果还是报0x80005000检查系统时间是否准确。这个错误码理论上属于ADSI错误时间偏差会导致身份验证类操作失败我遇到过一次是域控环境下的时间同步问题。终极方案直接编辑applicationHost.config文件。停止W3SVC服务或用管理员记事本打开找到对应应用池的processModel节点手动改add nameMyAppPool managedRuntimeVersion startModeAlwaysRunning processModel identityTypeLocalSystem / /add保存后重启IIS。这个方法绕过了IIS管理器的UI但前提是你要懂配置文件的结构改错了会直接起不来服务。改之前一定备份。还需要注意0x80005000这个错误也有人是因为Windows系统组件损坏导致的如果上面步骤都无效可以运行sfc /scannow扫描系统文件。5.3 回收策略、内存上限和CPU限制的常规配置应用程序池的高级设置里有几个参数生产环境建议这样配参数建议值理由启动模式AlwaysRunning避免首次访问冷启动闲置超时0永不防止长连接被回收固定间隔回收1740分钟29小时定时释放内存避开高峰虚拟内存上限按需设置一般不动限制过高会导致频繁回收私有内存上限按需设置防止内存泄漏拖垮服务器CPU限额视业务而定防止单站占满CPU回收时间是门玄学。设太短会导致请求频繁中断设太长又怕内存泄漏。我的经验是默认的29小时基本够用碰到某个站有明显内存泄漏时再单独对症下药。5.4 物理路径凭据和自定义账户创建网站时物理路径凭据默认是应用程序用户(传递身份验证)也就是用应用池的Identity访问站点目录。这在绝大多数场景下是够用的。但有些场景必须指定专用账户网站要读写UNC网络共享路径、要访问其他服务器上的数据库文件、或者目录权限绑定在特定域账户下。指定账户时注意每60天密码变更一次的话IIS里的配置不会自动更新会突然出现访问失败。所以要么用托管服务账户gMSA要么做好密码变更的运维流程。6. IIS备份与还原平时用不上用到能救命IIS配置其实很脆弱一个不小心改了applicationHost.config又没保存好整个服务器的站点全没了。所以备份这件事我得专门写一节。6.1 用IIS管理器做配置备份IIS管理器自带简单的备份/还原功能打开IIS管理器选中服务器节点不是某个具体的站点。右边操作区找到配置编辑器下面的管理区域有个备份入口。点击创建备份输入备份名称。备份的内容包括applicationHost.config、administration.config等核心配置文件以及加密的配置节密钥。还原的时候选对应备份点还原即可。有个坑IIS卸载重装后这些备份可能无法直接还原因为密钥和组件状态变了。所以备份IIS配置只是第一道防线更保险的方式是下面这种。6.2 用appcmd和PowerShell导出配置系统自带的管理命令行工具appcmd功能很强大导出整个配置很容易%windir%\system32\inetsrv\appcmd.exe list site /config /xml sites.xml %windir%\system32\inetsrv\appcmd.exe list apppool /config /xml apppools.xml这种方式导出的配置可读性很强适合做版本管理。恢复时对应使用appcmd add site /in sites.xml。PowerShell方式更灵活可以用Export-IISConfiguration需要WebAdministration模块或者直接用Copy-Item备份整个C:\Windows\System32\inetsrv\config目录。6.3 迁移到另一台服务器的要点把IIS网站从一台服务器迁到另一台很多人只拷贝了站点文件结果新服务器上怎么都打不开。完整迁移至少要做这几步在新服务器安装对应的IIS功能模块和运行时.NET Hosting Bundle、URL Rewrite等。创建相同的站点目录拷贝所有站点文件保持目录结构一致。迁移配置文件对比两台服务器的applicationHost.config中站点和应用池配置在新服务器上重建。设置相同的绑定点IP、端口、主机名。迁移证书和HTTPS绑定不要只迁站点配置忘了证书。测试所有功能特别是数据库连接字符串里的服务器地址要不要改。我见过有人在迁移时直接把旧服务器的整个config目录覆盖到新服务器结果IIS管理器直接打不开了因为机器密钥、系统路径都不一样。正确做法是只迁移applicationHost.config里站点和应用池部分或者用共享配置功能。7. 写在最后IIS运维的几点真实体会文章写到这里主要流程已经讲完了。最后分享几个这几年运维IIS攒下来的经验日志比性能监视器更实用。网站出问题的时候先看C:\inetpub\logs\LogFiles下对应站点的日志字段很多但重点关注sc-status状态码和time-taken响应耗时。状态码是500还是503排查方向完全不同。定期做配置备份不是可选项。我现在养成了每次改完IIS配置就导出一次sites.xml的习惯放在Git仓库里管理改坏了随时能回滚。这个习惯已经救了我两次。别盲目的把所有网站都往默认站点里塞。用IIS的默认站点做测试没问题生产环境每搞一个独立的站点和应用池权限互不干扰出问题也好定位。服务器上装安全软件要谨慎。有的国产安全软件会拦截IIS工作进程访问网络或者修改配置文件权限导致网站时好时坏。如果是生产服务器安全策略要在部署前就确定好。最后一条个人建议IIS的坑看起来多但绝大多数都能用看日志、查权限、翻文档这三板斧解决。部署前多看几遍配置文件部署后第一时间做备份。把这些基础工作做扎实了IIS其实是一个相当省心的Web服务器。
阅读完成 · 觉得有帮助?
咨询建站