ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

IIS配置后网站无法访问?一文搞定从定位到排查的所有坑

IIS配置后网站无法访问?一文搞定从定位到排查的所有坑 以前在Windows服务器上搭网站最怕听到的一句话就是“配置都弄好了怎么还是访问不了”。IIS这个东西装起来确实简单下一步下一步绑个目录填个端口网站好像就成了。可真到了浏览器里去访问你会遇到各种意想不到的情况本机打开localhost一切正常隔壁同事访问却一直转圈防火墙也放行了80端口公网还是进不来应用池明明在运行页面却抛503。这类IIS配置、网站无法访问的问题我排查过不少也帮同事收拾过不少烂摊子该踩的坑基本都踩过一遍。今天这篇就把IIS配置好之后访问不通的经典原因和排查路径梳理一遍给同样被折磨的你做个参考。1. 先定位网站访问不通问题到底出在哪一层1.1 本机、局域网、公网三种访问方式帮你圈定范围遇到访问不了先别急着改配置第一步永远是判断问题在哪一层。我的习惯是分三种情况看本机、局域网、公网每一种访问方式背后的问题模型完全不同。第一在本机浏览器输入http://localhost或http://127.0.0.1。如果这个都打不开问题基本就锁定在IIS自身——服务没启动、站点没启动、端口被占用这类从根上没起来的情况后面所有网络排查都是白费力气。本机能通说明IIS服务正常网站的绑定和默认文档也没问题需要往后看。第二输入http://服务器本机IP访问。注意这里有个常见的迷惑现象localhost通但用本机IP访问反而打不开。这是因为本机访问往往走回环接口不受防火墙入站规则限制而IP访问会走完整网络栈防火墙、IP绑定都会参与进来。这个现象一旦出现基本可以断定是绑定问题或防火墙问题。第三局域网内换一台电脑输入http://服务器IP访问。此时ping一下服务器IP确认网络通畅再用PowerShell执行Test-NetConnection -ComputerName 服务器IP -Port 80测试端口。端口不通就聚焦排查防火墙放行规则和端口监听情况端口通了但页面报错则回到IIS配置和权限上面来。公网访问还要再加一层域名解析、路由端口映射、云服务器安全组、运营商策略统统可能出问题。但公网排障的底层思路和局域网一致核心仍然是把“端口是否通”这一项确认清楚。分清这四种情况基本就能把问题范围缩小一大半接下来才谈得上动手修。1.2 服务没起来就别谈访问先看服务、再看端口、再看进程很多人一想到“IIS配置好网站无法访问”第一反应就是去改站点绑定或者查代码但实际上最该先确认的是IIS底层的东西到底有没有站起来。打开services.msc找到World Wide Web Publishing ServiceW3SVC和Windows Process Activation ServiceWAS。W3SVC是IIS的主服务它依赖WAS。这两个服务的启动类型建议都设成“自动”如果状态不是“正在运行”右键启动。服务没起来时IIS管理界面里站点会显示停止访问自然不通。这种情况常见于服务器重启之后服务启动顺序错乱或者被安全软件禁用把启动类型改好基本就没事了。再检查站点是否真的在监听端口。命令行执行netstat -ano | findstr :80正常情况能看到0.0.0.0:80或[::]:80的LISTENING记录。如果只看到127.0.0.1:80说明站点绑定只绑了回环地址外部自然无法访问得去改绑定。如果完全没有任何记录说明站点停了或没绑成功回到IIS管理器确认站点状态。最后看一眼进程。访问网站的时候任务管理器里应该能看到w3wp.exe进程这个进程对应应用程序池。如果你请求了页面但进程一起就崩或者进程反复重启说明应用池在不断崩溃回收此时要去事件查看器里看应用程序日志多半能发现内存溢出或某个DLL加载失败。我以前遇到过一个案例w3wp.exe起来就崩查半天发现是服务器上装了个不兼容的杀毒软件把IIS进程给拦截了最后卸载掉才消停。2. IIS站点配置的几个经典“隐形坑”2.1 绑定里的IP、端口、主机名是怎么影响访问的IIS的站点绑定是一个三元组IP地址、端口、主机名。很多访问不通的问题根源其实就在这三个值上面。先说IP地址。如果你在绑定里填了具体的IP比如127.0.0.1或某个内网IP那么只有通过这个IP访问才会命中站点。一旦服务器IP发生变化或者你用域名解析到了另一个IP网站立刻打不开。我建议测试阶段把IP地址设为“全部未分配”让IIS去匹配所有本机IP省去以后换IP踩坑。再说端口。80端口是Web默认端口但如果你的服务器上还跑着Nginx、Apache、Tomcat、SQL Server Reporting Services甚至Skype80端口很容易被它们占掉。IIS端口被占用时站点会停止或者绑定时直接报错。临时排查时把站点端口改成8080访问http://IP:8080如果通了就说明IIS本身没问题是80端口冲突剩下的就是去处理谁在占用80端口。最后是主机名。如果绑定里填了某个域名比如www.example.com那么客户端必须用这个域名来访问用IP直接访问反而不通因为IIS会根据HTTP请求的Host头发到对应站点。这也是多站点共用80端口时区分网站的手段。如果你还没把域名解析到服务器用IP测试时建议先把绑定里的主机名清空否则你会被“配置没毛病但就是打不开”折腾一晚上。2.2 默认文档、父路径、处理程序映射不起眼但能卡住你站点绑定没问题、端口也正常访问依然报404或403这时候就要看一些容易被忽略的细节默认文档、ASP父路径、处理程序映射、MIME类型。默认文档是最常见的。把网站文件放到物理目录后浏览器输入域名不指定文件名IIS会按顺序查找默认文档列表里的文件。默认列表包含Default.htm、Default.asp、Index.html这类如果你的首页是login.html或main.php必须手动在“默认文档”功能里添加。否则访问域名根路径会直接404但访问http://域名/login.html又能打开非常典型。ASP父路径主要用于老一代ASP程序。有些旧系统代码里使用了../这类相对路径访问上级目录IIS 6之后默认禁用了父路径直接导致页面报错。处理方式是在IIS管理器选中站点双击“ASP”功能把“启用父路径”设为True。遇到老ASP程序迁移到新服务器时这个坑出现频率极高建议提前检查。处理程序映射和MIME类型更多体现在特定应用上。如果你部署的是Unity导出的WebGL直接把整个发布目录丢进IIS浏览器打开大概率白屏或报错因为.wasm、.data、.unityweb这些扩展名的MIME类型IIS默认不认识。需要在“MIME类型”里手动添加常用的是application/wasm映射.wasm。原理很简单IIS本质是个静态文件服务器加扩展托管平台文件扩展名没有对应的MIME或者处理程序它不知道该怎么返回给你。2.3 应用程序池选错一样白搭.NET版本与管道模式IIS里有“应用程序池”这个概念可以理解成每个网站独立运行的“沙箱环境”。很多访问不了、报500或503的问题最后都追到应用池配置上。最常见的错误是把ASP.NET 2.0时代的旧程序放进了.NET CLR版本 v4.0的应用程序池结果页面直接报错或白屏。正确做法是在应用池的“高级设置”里把.NET CLR版本改成程序实际对应的版本如果你运行的是纯静态页面或经典ASP无托管代码就够了反而更轻量。托管管道模式也值得注意。集成模式是IIS 7之后的默认模式性能好、模块管理清晰但某些老组件和ISAPI过滤器在集成模式下会不兼容。遇到程序在旧服务器上一切正常、新服务器上各种500错误的情况可以尝试把应用池的托管管道模式改为“经典Classic”经常能救回来。再补充一个32位应用程序的开关。如果你的站点要加载一些32位组件比如老的Oracle客户端、COM组件、C Builder生成的DLL必须在应用池高级设置里把“启用32位应用程序”设为True否则会出现“无法加载DLL”之类的错误。这一点容易忽略因为新装的Windows Server默认是64位环境而很多老程序依赖的库还是32位的。3. 权限问题403和500的背后往往是它3.1 匿名身份验证与IIS_IUSRS权限网络通了、站点也起来了、绑定也正确浏览器还是提示403禁止访问十有八九是权限问题。IIS的权限体系分成两层第一层是Windows文件系统权限第二层是IIS自身的认证授权配置。匿名访问时IIS默认使用内置的IUSR账户来读取网站文件。如果这个账户对物理目录没有读权限IIS就无法把HTML或图片返回给浏览器表现就是403。解决方法是给物理目录添加IIS_IUSRS组权限。右键网站目录属性安全编辑添加输入IIS_IUSRS勾选“读取与执行”“列出文件夹目录”“读取”这三项确定即可。这里多说一句很多人图省事直接给Everyone或Users完全控制权限网站是能跑了安全隐患也非常大。网站目录一旦被写权限放开攻击者上传个脚本文件就能执行后果不堪设想。生产环境的原则永远是最小权限IIS_IUSRS只给读Write权限只针对上传目录、日志目录等确实需要写入的位置单独设置。3.2 应用程序池标识别动不动就LocalSystemIIS的每个应用程序池都有一个“进程模型标识”也就是w3wp.exe进程以哪个账户身份运行。这个设错了轻则目录读写失败重则站点直接503。默认情况下应用池使用ApplicationPoolIdentity这是一个虚拟账户自动按应用池名称隔离权限。目录授权时可以通过“IIS AppPool\应用池名称”这种形式把权限授给指定的应用池。比如默认池就是IIS AppPool\DefaultAppPool。这个模式的优点是每个应用池相互隔离互不影响符合最小权限原则。但很多人在配置时遇到权限搞不定图方便把标识改成LocalSystem问题确实能解决却埋了大雷。LocalSystem是Windows最高权限账户之一一旦你的网站程序存在漏洞被上传恶意脚本攻击者相当于拿到了整台服务器的控制权。实测中我见过不少因为图省事用LocalSystem跑站点最后服务器被植入挖矿程序的案例。正确思路是保持ApplicationPoolIdentity如果某目录需要写入权限就在目录安全设置里添加“IIS AppPool\你的应用池名”给上修改权限。既解决功能问题又保证隔离性和安全性。3.3 经典报错0x80005000应用程序池权限设置失败的排查思路热搜词里“iis应用程序池权限设置失败请手动为其设置localsystem权限未知错误(0x80005000)”这个问题我确实遇到过好几次。出错场景通常是在IIS管理器里修改应用程序池的“标识”时点了LocalSystem或其他内置账户结果弹出“应用程序池权限设置失败请手动为其设置LOCALSYSTEM权限。未知错误(0x80005000)”。0x80005000这个错误码可以通俗理解为系统拒绝访问或配置存储无法写入。在这个场景里核心问题多半不是应用池参数本身而是IIS配置存储的读取权限出了状况或者当前操作的上下文权限不足。按以下顺序排查和处理多数情况能解决。第一步确保你用来操作IIS管理器的账户具备管理员权限并且尽量用“以管理员身份运行”的方式打开IIS管理器。权限不足时最典型的表现就是这类莫名其妙的HRESULT错误。第二步检查IIS配置目录的权限。打开资源管理器进入C:\Windows\System32\inetsrv\config确认该目录的权限中Administrators和SYSTEM有完全控制。这个目录存放applicationHost.config等核心配置文件IIS管理器修改应用池标识时需要写入这里的配置权限不对就会报0x80005000。第三步用命令行直接设置应用池标识绕开管理器GUI的异常路径。管理员CMD里执行%windir%\system32\inetsrv\appcmd.exe set apppool DefaultAppPool /processModel.identityType:LocalSystem把DefaultAppPool换成实际的应用池名称。如果这个命令能执行成功问题基本出在IIS管理器或配置存储权限上而不是应用池本身。第四步执行iisreset /noforce重启IIS服务再回到管理器里看是否正常。如果仍然报错可以尝试在“服务器管理器”里重新修复IIS管理脚本和工具或者修复.NET Framework组件因为0x80005000有时也和IIS对.NET配置的读取有关。最后说句实在话这个错误解决后建议把应用池标识设回ApplicationPoolIdentity然后针对目录授权。用LocalSystem确实能绕开权限问题但那是拿整台服务器的安全去换一个省事不值得。4. 端口占用与防火墙80端口为什么就是不通4.1 用netstat揪出占80端口的真凶IIS网站访问不了一种极其常见的情况是80端口被其他程序占了。症状表现是站点在IIS管理器里显示正在启动但始终无法访问或者启动直接报错“另一个程序正在使用此文件进程无法访问”。先用命令看谁在占用80端口netstat -ano | findstr :80输出里找到LISTENING对应的PID再用tasklist /fi pid eq PID号查看是哪个进程。常见的“凶手”包括Nginx、Apache、Tomcat、SQL Server Reporting Services、Skype甚至某些网银控件。Skype曾经默认占用80端口这个坑帮不少人踩过。如果你看到PID对应的是“System”进程也别太意外。这种一般是HTTP.SYS在内核层面对80端口做了绑定常见于IIS自身已经绑定了该端口或者之前配置过SSL证书绑定。此时可以用netsh http show servicestate查看HTTP服务状态确认站点是否正常注册监听。一个最快的验证方法把IIS站点绑定的端口临时改成8080访问http://IP:8080。如果通了证明IIS完全正常问题定位到80端口冲突接下来处理占用程序就好。如果8080访问也有问题再去查IIS配置和权限。4.2 防火墙入站规则与云安全组死角里的拦路虎端口监听是好的本机访问也正常但局域网或公网就是不行这就要重点怀疑防火墙了。Windows防火墙在默认配置下不会放行80端口必须手动添加入站规则。操作路径很固定控制面板→Windows Defender防火墙→高级设置→入站规则→新建规则→端口→TCP→特定本地端口填80如果要跑HTTPS再填443→允许连接→勾选“域”“专用”“公用”三个配置文件→输入名称完成。这里特别提醒勾选“公用”配置文件。很多服务器网卡被识别为“公用网络”如果防火墙规则只在“专用”下生效依然会被拦截。你可以在“网络和共享中心”里查看当前网络类型然后确保对应的配置文件中放行了端口。如果是云服务器还要检查云平台的安全组。我在阿里云、腾讯云上都遇到过类似情况Windows防火墙全放了80端口本机测试是通的公网就是进不来一查发现是安全组入方向规则没放行80。云服务器的安全组优先级高于系统防火墙这一步漏掉排查多久都白搭。快速测试端口通不通的方法在客户端机器上执行Test-NetConnection -ComputerName 服务器IP -Port 80如果TcpTestSucceeded显示False说明端口仍在传输层被拦截继续往防火墙和安全组方向查。4.3 域名、HSTS与443端口的问题如果域名访问不通而IP访问正常优先查域名解析在客户端执行ping 你的域名看解析出的IP是否指向服务器。解析正确但访问仍然失败再测试http://服务器IP:80排除IIS配置本身的问题。还有一个更容易忽略的场景浏览器提示“您目前无法访问因为此网站使用了HSTS”。这通常不是IIS配置问题而是浏览器记住了该域名的HSTS策略。HSTS的含义是浏览器强制使用HTTPS访问此站点如果你之前启用过HTTPS之后只保留了HTTP绑定再访问HTTP地址时浏览器会直接拦截连请求都不发出去。解决办法有两个一是把IIS的HTTPS绑定和证书都配好443端口放行让浏览器走HTTPS二是在排查阶段用浏览器的隐身窗口或临时关闭该站点的强制HTTPS策略。我排查时习惯把“传输层不通”和“应用层报错”分开看传输层不通查端口、防火墙、安全组、DNS应用层报错再回到IIS状态码来定位。分层排查的好处是不会东一榔头西一棒子效率高很多。5. 三个真实案例复盘照着做就行5.1 案例一本机能开、局域网打不开这是一次典型的防火墙问题。起因是帮朋友调试一台Windows Server 2019上的IIS站点配置过程一切正常IIS管理界面里站点显示已启动本机访问http://localhost和http://服务器IP都能打开。但局域网另一台电脑输入http://服务器IP时浏览器一直转圈直到超时。我让朋友ping服务器IP结果通畅说明网络链路没问题再执行Test-NetConnection -ComputerName 服务器IP -Port 80返回TcpTestSucceeded为False等于明确告诉我80端口在传输层就被拦住了。打开Windows防火墙高级设置一看入站规则里根本没有80端口的规则。解决方案很简单新建一条TCP 80端口入站规则三个配置文件全部勾选确定生效局域网其他电脑立刻就能访问了。这个案例说明一个问题IIS监听正常不代表防火墙会放行流量系统防火墙和云安全组是两个独立关卡缺一不可。5.2 案例二一访问就报500.19有段时间同事部署一个新网站IIS配置都填好了但浏览器访问时直接弹出“HTTP错误500.19 - Internal Server Error”提示配置数据无效。这种报错看第一眼容易以为是web.config语法写错了实际上多半和配置文件本身没关系而是进程没有权限读取配置文件。500.19的官方解释是“无法访问请求的页面因为该页面的相关配置数据无效”但实际发生更频繁的原因是物理路径权限问题。同事把网站文件放在了D:\project目录但新建目录后没有给IIS相关账户授权。IIS工作进程读取web.config或网页文件时系统返回拒绝访问于是呈现给用户一个模糊的500.19。处理方式很直接右键网站物理目录属性安全编辑添加IIS_IUSRS组勾选读取与执行、列出文件夹目录、读取确定后刷新页面网站恢复正常。如果站点有上传功能再根据应用池名称给IIS AppPool\对应池名称单独添加修改权限权限粒度控制在最小范围。从那以后我每次新建站点都会顺手把目录权限一次配齐省得被这种报错坑第二次。5.3 案例三一台服务器两个网站另一个总是503服务器上放了两个网站A站一直好好的B站打开之后偶尔正常多刷新几次就变成503服务不可用过一会又自己恢复。这种间歇性503让人头大因为看起来像是网络问题实际上根源在应用池。到事件查看器的“Windows日志→应用程序”里翻了翻看到了关键提示B站的应用程序池因为达到配置的内存限制而被自动回收导致站点期间不可用。B站用的还是默认的同一个应用池A、B两个网站共用一个池自然互相影响。解决分三步给B站单独建一个应用程序池站点绑定到新池上把应用池高级设置里“回收”下的“专用内存限制”调整为0即不限制然后重启应用池。这样操作之后B站稳定了。同时我也提醒同事如果以后业务代码内存占用持续增长还是要排查程序自身有没有内存泄漏应用池调参只是治标根子上的内存问题不解决迟早还会复现。多个网站放在同一台IIS服务器时前端看着是同一台机器后端一定要通过独立应用池做隔离这是我在这个案例里感触最深的一点。6. 排查终极大法读IIS日志而不是瞎猜6.1 日志到底在哪怎么读遇到IIS问题最快的方法是看日志而不是靠猜。IIS的日志默认存放在C:\inetpub\logs\LogFiles\W3SVC站点ID目录下文件名形如u_ex250115.log其中站点ID可以在IIS管理器左侧“网站”节点看到也可以在CMD里执行appcmd list site查。日志里每一行记录一个请求格式为W3C标准包含时间、客户端IP、请求方法、请求路径、协议、状态码、子状态码等。排查时最常用的是搜索状态码比如用文本编辑器打开日志文件直接搜索500、503、404等。举个例子如果访问报500日志里可能会看到请求的路径和状态码配合事件查看器大致能定位到是代码异常、权限不足还是应用池崩溃。我习惯在日志目录里看最近几天的文件重点看报错时段前后的记录。如果某个路径反复出现500或503说明是特定请求触发的去查对应页面的代码或依赖组件如果所有请求都是404基本断定默认文档或物理路径配置有误。6.2 HTTP状态码速查表看到报错先对照IIS报错时状态码会直接告诉你方向不需要从零开始猜。整理一份速查表供你对照状态码含义常见原因与排查方向200正常请求处理成功301/302重定向检查URL重写规则或HTTPS跳转配置401未授权匿名认证被关闭、目录权限缺失、密码凭据错误403.14目录列表禁止没有默认文档开启默认文档或允许目录浏览404文件不存在默认文档缺失、物理路径错误、MIME类型未配置500.19配置数据无效物理目录权限不足、web.config格式错误502.5进程启动失败反向代理下游应用没启动如ASP.NET Core、Node服务503服务不可用应用池停止、应用池崩溃被回收、内存限制触发回收看到“502”“503”时优先去查应用池状态和下游进程它们一般不是IIS本身坏了而是IIS背后的应用程序没跑起来。看到403和500.19时优先查目录权限这个占比非常高。6.3 临时开启详细错误信息排完记得关IIS 7及以上版本默认不会把详细的错误堆栈返回给浏览器只显示一个笼统的“HTTP错误500.0”。排查时可以把详细错误临时打开等修复后再改回去。最简单的方法是打开IIS管理器选中站点双击“错误页”点击右侧“编辑功能设置”选择“详细错误”确定。如果站点用了web.config管理也可以直接在配置文件里写system.webServer httpErrors errorModeDetailed / /system.webServer对于ASP.NET应用还需要把customErrors modeOff /加到system.web节点里才能看到具体异常信息。注意这一切只是排查手段生产环境务必恢复到默认设置否则错误详情会暴露给所有访问者等于把服务器信息免费送人。还有一个小众但真实的启动报错IIS服务启动时提示未能加载BouncyCastle.Crypto。这通常和服务器上某个证书管理或加密组件有关引用了这个类库但版本对不上。处理思路是先到IIS模块列表和全局程序集缓存里找相关插件卸载或重装对应组件即可不要直接去动系统文件否则容易把证书服务搞坏。排查了这么多轮说点个人习惯。我遇到IIS访问不了从不先翻web.config而是按“网络通不通→服务起没起→端口听没听→日志怎么说→权限够不够”这条链路走一遍绝大多数问题其实就藏在这几层里。印象最深的一次教训是为了图省事排查阶段把应用池标识改成LocalSystem速度倒是快了后来才发现安全隐患太大又花时间改了回来。网站能访问只是底线权限收敛和日志习惯才是长期运维里真正省心的东西。希望这篇能让你少走点弯路。
返回列表