IIS75详细错误

IIS75详细错误

你打开浏览器,详细错输入网址,详细错回车。详细错页面空白,详细错然后弹出一行蓝底白字:HTTP Error 500.0 - Internal Server Error。详细错这玩意儿叫IIS 7.5,详细错Windows Server 2008 R2自带的详细错Web服务器。我见过太多人在这行字前抓耳挠腮,详细错其实它没那么玄乎——大部分错误就三类:权限、详细错配置、详细错代码。详细错

先说权限。详细错IIS 7.5最坑的详细错地方在于,它默认用应用程序池身份运行,详细错而不是详细错以前的Network Service。你辛辛苦苦把网站文件传到服务器,结果访问时给你来个500.19,提示“无法读取配置文件”。这时候别急着改代码,先右键网站文件夹,安全选项卡里加一个IIS_IUSRS组的读取权限。就这一步,能解决一半的“莫名其妙”错误。我见过一个运维同事,排查了三个小时,最后发现是文件夹权限里少了“Authenticated Users”,加上就好了。

配置错误更隐蔽。你改了web.config,刷新页面,突然冒出500.23,说“检测到不支持的配置”。大多数情况下是你启用了托管模块,但应用程序池没设成Integrated模式。IIS 7.5有两种管道模式——Integrated和Classic。前者把所有请求都交给ASP.NET处理,后者只处理特定扩展名。你要是把runAllManagedModulesForAllRequests设为true,又跑在Classic模式下,那基本必炸。解决办法很简单:应用程序池→基本设置→托管管道模式改成Integrated。别问我为什么,微软就是这么设计的。

代码错误就更有意思了。IIS 7.5的500.0错误页经常只显示“模块IsapiModule通知ExecuteRequestHandler”,下面一行小字“请求的URL不可访问”。这种时候,Windows事件查看器才是你真正的朋友——应用程序日志里会写清楚具体是哪一行代码抛了异常。有一次我排查一个ASP.NET MVC应用,页面一直500,日志里写着“无法加载文件或程序集System.Web.Mvc, Version=4.0.0.0”。服务器上装的是MVC 3,项目引用的是MVC 4。引用不匹配,就这么简单。

还有个冷门但烦人的——502.3,Bad Gateway。这通常是反向代理或FastCGI进程崩了。PHP站点最容易中招。你打开php-cgi.exe进程列表,发现一堆僵尸进程卡在那。IIS 7.5的FastCGI设置里有个“活动进程数”上限,默认是4。你要是开了多个站点,每个站点都跑PHP,进程根本不够用。把最大实例数调到16,问题立刻消失。别问为什么是16,我试过,稳定。

最后说个真事。去年帮一个客户迁移老站,从IIS 6到IIS 7.5,页面全变乱码。查半天,原来是web.config里编码声明是GB2312,而IIS 7.5默认按UTF-8解析。改一个字符的事,折腾了俩小时。你永远猜不到IIS 7.5会在哪里给你挖坑——有时候是URL重写模块版本不对,有时候是缺了某个ISAPI筛选器,有时候纯粹是服务器上装了360安全卫士把系统DLL给锁了。

所以真遇到IIS 7.5报错,别慌。按顺序查:先看权限,再看应用程序池管道模式,然后翻事件查看器,最后检查FastCGI进程数。八成能解决。剩下两成,重启服务器,然后祈祷。