端口被占用这个问题是我们在开发中会比较常见到的问题。
网络上比较普遍的答案会告诉你这样去解决。首先通过一下命令查询是有进程在使用特定的端口查找占用进程的PIDkill掉该进程
大部分情况下这样操作是可以解决问题的,但是最近就是遇到一个情况。
偶尔出现Redis\Mysql数据库由于一些原因自身挂掉了,然后服务器还运行了其他守护进程,守护进程Supervisor在自动重启其管理的守护进程时,就出现了占用Redis 6300端口 或 Mysql 3306 端口的情况,然而 守护进程中也有进程Mysql数据库连接的操作,Mysql连接不上导致程序也报错,守护进程也不断报错异常退出,
如此进入到一个死循环阶段。
经细查原因分析如下:
- Mysql数据库挂掉后,3306端口被系统闲置
- PHP守护进程中数据连接出问题,进程挂掉再次重连时发现3306端口空闲,于是系统给分配3306 端口给该守护进程
- Mysql自身重连时发现3306已被占用,无法再次启动
- PHP守护进程中连接Mysql一直连接不上,一直保持异常,直到进程退出不再重启
- ......
于是我猜想,Linux系统能不能不把3306,6300 作为空闲端口来分配呢? 答案是:可以的。
这里有两个配置: