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
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 使用,把需要保留的端口配置好。
- 原文作者:Linux运维菜
- 原文链接:https://www.opcai.top/post/2019/2019-02/linux_reserved_ports/
- 版权声明:本作品采用进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。