彻底解决Linux端口被占用问题

/ 0评 / 0 / 187 次 /

端口被占用这个问题是我们在开发中会比较常见到的问题。

网络上比较普遍的答案会告诉你这样去解决。

  1. 首先通过一下命令查询是有进程在使用特定的端口
netstat -tln | grep 9877
  1. 查找占用进程的PID
lsof -i:9877
  1. kill掉该进程
kill -9 18080

大部分情况下这样操作是可以解决问题的,但是最近就是遇到一个情况。
偶尔出现Redis\Mysql数据库由于一些原因自身挂掉了,然后服务器还运行了其他守护进程,守护进程Supervisor在自动重启其管理的守护进程时,就出现了占用Redis 6300端口 或 Mysql 3306 端口的情况,然而 守护进程中也有进程Mysql数据库连接的操作,Mysql连接不上导致程序也报错,守护进程也不断报错异常退出,
如此进入到一个死循环阶段。

经细查原因分析如下:
- Mysql数据库挂掉后,3306端口被系统闲置
- PHP守护进程中数据连接出问题,进程挂掉再次重连时发现3306端口空闲,于是系统给分配3306 端口给该守护进程
- Mysql自身重连时发现3306已被占用,无法再次启动
- PHP守护进程中连接Mysql一直连接不上,一直保持异常,直到进程退出不再重启
- ......

于是我猜想,Linux系统能不能不把3306,6300 作为空闲端口来分配呢? 答案是:可以的。

vim /etc/sysctl.conf

这里有两个配置:

# 这里是本地tcp/udp的端口范围,系统发现在这个范围内有空闲端口就会自动分配给需要的进程
# 有人说 把起始端口改大一点不就行了吗? 这样就不会占用到 3306 这类数据库端口了啊,
# 可以说不推荐这样做, 改太大 可用的端口范围就变小了
net.ipv4.ip_local_port_range = 1024 65000

# 这里是预留端口号的配置,推荐用这种方式。
net.ipv4.ip_local_reserved_ports=3306,6300

发表评论

电子邮件地址不会被公开。 必填项已用*标注