linux-防止服务端口被占用
前言
在高并发的服务器上,会发现你的服务监听端口会被占用,导致服务启动不了。
通过日志查看,发现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
3276860999 (第一个是开始端口,后面一个是结束端口)
对应的sysctl.conf的参数:
sudo sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 3276860999
可以根据自己的需要设置端口范围。
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使用,把需要保留的端口配置好。