现象
nginx所在服务器上的应用偶现规划的端口被探测到激活,从而导致被ng分配请求,但却给不了正常的数据;
同时:
通过命令netstat -anlp|wc -l
显示有大量tcp连接,对open files值也有参考意义
通过命令netstat -anlp|awk '{print $4}'|sort|uniq -c|wc -l
显示有大量端口占用,统计第四列表示本地使用的端口(会重复)
解决1:范围增大和保留端口不被占用
TCP/IP协议栈从ip_local_port_range中随机选取源端口时,会排除ip_local_reserved_ports中定义的端口,因此不会出现端口被占用导致服务无法启动的问题。
使用net.ipv4.ip_local_port_range参数,规划出一段端口段预留作为服务的端口,这种方法是可以解决当前问题,但是会有个问题,端口使用量减少了,当服务器需要消耗大量的端口号的话,比如反代服务器,就存在瓶颈了。
判断是否规划的端口在随机分配端口(也可增加范围)
sysctl -a |grep net.ipv4.ip_local_port_range
默认:net.ipv4.ip_local_port_range = 32768 60999
当长连接比较多时,可适当增加此参数
如果端口在随机分配端口之内,则写如下配置,以保留不会被分配
vim /etc/sysctl.conf
#支持“-”写端口段:33000-33100
net.ipv4.ip_local_reserved_ports = 35080
保存后,执行命令生效:sysctl -p
解决2:把ng服务与应用服务分开部署
当ng与需要反代的服务放一起时,会随机分配端口与反代服务映射,而因为都在同一台服务器,并发高时,此端口会被占用;
最大可用端口数
IP的端口是双字节,也就是256256-1, 256256对计算机来说就是0,因为此最大的端口号是65535而不是65536,当然端口数值是0-65535,数量是65536个,但0一般不用,故而我们通常都说65535,而且端口号最大也是65535,所以我们都说端口是65535
如何突破端口限制
每个机器还可以装多个网卡,在极端情况下,是可能通过增加网卡IP的形式来突破。根据tcp连接四要素:
【源IP、源Port、目标IP、目标Port】,机器自身系统无关,在交互时以网卡标识。
实际几乎大多情况
端口不是说占用了就一直是你的了,你不用了还可以释放,释放后别的程序还能接着使用,所以,动态利用之下,很难把端口占完的。
其二、要分清端口和连接。一个端口可以有若干个连接,如nginx,普通linux上,一个80端口就能并发10万+的连接,极限情况下,可以近百万。所以,由于端口复用,其实并不会用到那么多端口。
所以,65536个端口用完的话基本上不会出现。