昨天下午,加网同事老张跑过来,站后脸色不太好看。无法他说自己刚在IIS里加了个新站点,访问配置看着没问题,加网防火墙也放了80端口,站后但浏览器一访问就是无法“无法访问此页面”。我过去一看,访问果然,加网站点列表里状态是站后“已启动”,绑定也写对了IP和端口,无法可就是访问死活打不开。
这种问题我遇过太多次了。加网别急着重启IIS,站后八成是无法些不起眼的小地方卡住了。
先看应用程序池。老张新建站点的时候,IIS默认给他分配了一个新的应用程序池,.NET版本是v4.0,托管管道模式是“集成”。这本身没问题,但坏就坏在他原来那个老站点跑的是经典模式,两个池子混着用,偶尔会出幺蛾子。我让他把新站点的应用程序池改成和旧站一致,或者干脆新建一个专用池,别共用。改完刷新,还是不行。
那就查绑定。打开站点“绑定”对话框,仔细看主机名那一栏。老张填了“www.test.local”,但本地hosts文件里根本没加这条记录。浏览器访问这个域名,DNS解析直接失败,自然连不上。我让他先改成IP访问试试——把主机名清空,绑定IP地址加端口80。这回浏览器能弹出来了,但显示403.14。
403.14,这个错误码很典型,是目录浏览被禁了。IIS默认不给列目录,而老张的站点根目录下压根没有默认文档。他放了个index.html进去,但IIS的默认文档列表里没有.htm或.html这一项。在IIS管理器的“默认文档”功能里添加一下,再刷新,页面出来了。可内容乱七八糟,样式全丢了。
这时候老张有点急了,说是不是代码有问题。我让他看看站点的物理路径权限。他站点放在D盘的某个文件夹下,右键属性一看,IIS_IUSRS用户组对该目录没有读取权限。这个组是IIS运行工作进程的账户,没权限就读不了静态文件,更执行不了ASP.NET。加上读取权限,再给应用程序池对应的用户也加上,刷新,页面正常了。
还有个坑,老张没遇到,但很多人会踩。就是端口被占用。如果你绑定的是8080之类的非默认端口,先netstat -ano看看这个端口是不是被别的进程占了。有时候装过其他Web服务器,或者某个开发工具偷偷占了端口,IIS绑定不报错,但就是访问不了。换一个没被占用的端口,立刻好。
最后说个容易忽略的——IPv6。如果服务器绑定了IPv6地址,而客户端用IPv4访问,或者反过来,也会出现连不上的情况。在绑定对话框里把IP地址选成“全部未分配”,或者明确写“*”,让IIS同时监听所有地址,问题通常就解决了。
老张那台机器最后查出来是物理路径权限和默认文档两个问题叠加。改完他挠挠头说,原来IIS这么矫情。其实不是矫情,是它把每一步都拆得很细,任何一个环节断了,访问就断。遇到“无法访问”,别慌,按着应用程序池、绑定、权限、默认文档这个顺序排查,十有八九能解决。要是还不行,打开C:\Windows\System32\inetsrv\LogFiles下的日志,看具体返回码,比瞎猜快得多。