昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80端口。在这2台服务器上,浏览器打不开任何网站,但能ping通。重启其中1台服务器后,被重启的服务器恢复正常。
服务器用的是阿里云的,开始以为是阿里云的问题,向阿里云提交了工单。在提交了 netstat -nat 的信息后,阿里云工程师很快定位出问题原因,是TCP MaxUserPort不够用引起的,当时TCP连接的端口数是6000多,而Windows的默认最大TCP连接端口数(MaxUserPort)是5000。
知道这个原因后,上那台还在故障中的服务器,用netstat -n | find /C /I "established"
一看,果然超过了5000(如果用PowerShell,可以用命令Get-Counter -Counter TCPv4*
查看)。
从这个原因出发,所有的故障现象都有了合理的解释:
- 连不上自己的本机80端口:连接本机80端口,也需要客户端TCP端口,没端口可用当然连不上;
- 其它服务器可以连接到这2台服务器的80端口:其它服务器只是连接这2台服务器已有的80端口,不需要额外的端口;
- 浏览器打不开任何网站:浏览器访问网站,建立TCP连接需要分配客户端TCP端口;
- 能ping通:ping走的是ICMP协议,不够用的是TCP协议的端口,所以不受影响;
- 重启后恢复正常:占用的TCP端口被重置,重新分配,还未达到5000的限制。
知道了真正原因,解决起来就很简单,修改最大TCP连接端口数(MaxUserPort)限制,修改方法:在注册表HKLMSYSTEMCurrentControlSetServicesTcpipParameters
中添加名为MaxUserPort,类型为DWORD(32-bit),值为65543(10进制)的项目并重启计算机。