线上服务器遇到几次相同现象的问题:可以正常远程访问服务器,资源消耗不多,但是网页或是socket无法连接,连接错误是ERR_CONNECTION_REFUSED,也就是服务器拒绝了。首先可以确认不是ddos流量攻击,因为流量攻击肯定远程也连不上。导致这个问题的绝大部分原因是服务器的TCP连接被占满了。
怎么占满的呢?我们遇到了这几个情况:
-
客户端有bug,在断线重连的时候有一个死循环不断请求连接,服务器重启的时候很多客户端同时连接,把TCP占满了
-
php后台,apache环境,配置有问题,导致php大量请求没有释放。后来改成nginx解决的
-
cc攻击,大量请求访问网站,导致TCP占满
如果遇到了这个问题,如何查看呢,打开Windows Task Manager(任务管理器)->Performance(性能)->Resource Monitor(资源监视器),在这个页面会看到TCP连接数的图表,在右边,正常情况是没有占满的,如果出现问题会显示满了,变成0-10,看不到现在是多少,这时候可以在Run(运行)中输入perfmon.msc打开Performance Monitor(性能监视器),在菜单栏,点击加号,选择IPv4(如果你的程序是IPv6,那就选择IPv6),添加进来,就可以具体看到TCP的连接数和曲线,也可以看到是哪个进程占用的多。