前言

在高并发的服务器上,会发现你的服务监听端口会被占用,导致服务启动不了。

通过日志查看,发现 address already in use

原因及快速解决

1、被其他服务占用了监听端口,这时候就要选择哪个服务要使用这个端口了,其中一个修改成其他端口就可以正常启动了。

通过 ss 或者 netstat 查看监听端口的程序

ss -lntp   | grep 5666

2、被随机端口占用了。linux 作为客户端的时候,在连接服务端时,系统会分配一个临时的端口用于网络连接,正好所要监听的端口被选做临时端口,导致服务启动不了。这时候最快的方法就是服务修改一个端口,尝试重新启动,因为高并发下,不知道什么时候会释放这个端口。

通过 ss 或者 netstat 查看所有端口(p 参数可以查看到程序的 id 名称等,需要 root 权限,但是速度会比较慢)

ss -anotp | grep 5666

以上的解放方法都是临时的方法,因为不确定什么时候端口就被选做临时端口了。

保留服务监听端口

在 Linux 上可以通过设置内核参数来保留服务端口。

1、设置本地临时端口的范围

cat /proc/sys/net/ipv4/ip_local_port_range

32768 60999 (第一个是开始端口,后面一个是结束端口)

对应的 sysctl.conf 的参数:

sudo sysctl  -a | grep ip_local_port_range

net.ipv4.ip_local_port_range = 32768 60999

可以根据自己的需要设置端口范围。

2、预留端口配置

cat /proc/sys/net/ipv4/ip_local_reserved_ports

5666,10050,11020-11030 (可支持逗号分隔的多个数字和范围)

对应的 sysctl.conf 的参数:

sudo sysctl -a | grep ip_local_reserved_ports

net.ipv4.ip_local_reserved_ports = 5666,10050,11020-11030

这个参数如果写到/etc/sysctl.conf,需要执行 sysctl -p 进行生效。但是就算是生效了,端口也不是马上释放的,需要等程序自动释放掉了。

总结

为了高并发的情况下,有足够的端口可以使用,一般将本地临时端口范围设置比较大,因此 ip_local_port_range 就有可能包含了我们服务端口,这时候就需要配合 ip_local_reserved_ports 使用,把需要保留的端口配置好。