怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

windows无法通过ip访问IIS网站

在之前处理的一个问题中,发现使用windows server的IIS服务搭建的网站存在访问异常,通过主机名+端口号和localhost+端口号的方法可以正常访问,但是通过127.0.0.1+端口号、局域网ip+端口号、公网ip+端口号的方式均无法正常访问,报错如下:Bad Request-Invalid Hostname(HTTP Error 400.The request hostname is invalid)。

从报错信息来看,系统对访问链接的解析存在异常,使用域名访问需要进行解析,但是使用ip访问则不需要,而报错信息明确提示是无效的主机名,看起来是将链接中的ip地址当作主机名进行解析,因此产生了如上的报错信息。

首先尝试查看相关的错误日志,相关的错误日志存储在C:\Windows\System32\LogFiles\HTTPERR路径下的httperr.Log文件中,但是奇怪的是,当在浏览器上使用ip+端口的方式进行访问时,在对应日志中没有相关时刻的任何记录,看起来访问链接还没有进入到iis中,即在上层就已经失败。

无法从日志中获取更详细的信息,转而考虑配置域名解析文件,公共的域名服务器没有办法修改,就修改系统的host文件,路径为C:\Windows\System32\drivers\etc下的hosts文件,在其中增加127.0.0.1和主机名之间的解析规则。但是无效,网站访问报错依旧。

继续考虑修改域名解析配置,将网络设置中的自动获取域名服务器改为手动配置,配置默认域名服务器为8.8.8.8和1.1.1.1,仍然无效。

这时注意到IIS中配置的网站达到了200多,而且问题不是一开始就有的,而是开始时正常运行了一段时间,之后才突然出现了问题,怀疑是不是IIS服务存在相关设置。

通过向资深工程师咨询,发现在IIS中确实存在这样一个配置项:dynamicRegistrationThreshold。

windows在IIS 8.5 及以上引入这个属性(Win Server 2016上默认装的IIS 是 IIS 10),详情可参考官方链接:https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/weblimits;

当服务器处理站点数大于dynamicRegistrationThreshold 所设置的值时,IIS 服务会使用动态站点激活,即IIS 服务启动时并不会直接启动所有站点,只有当请求到某个站点时,那个站点的监听管道才会被动态激活。在这种情况下(站点数超过dynamicRegistrationThreshold 设置值从而启用动态站点激活后),IIS 便不允许使用IP 地址发送 Web 请求,这就是问题原因。

后续将dynamicRegistrationThreshold的设置值从默认的100改为1000后,ip访问恢复正常。