Redis绑定IP无效疑难杂症(redis绑定IP没生效)

2023-05-14 15:03:23 绑定 生效 疑难杂症

Redis绑定IP无效:疑难杂症

Redis是一款高性能的键值存储系统,常用于做缓存、消息队列以及持久化存储等等。在使用Redis过程中,我们经常需要绑定IP才能保证安全性和稳定性。但有些时候,我们会遇到Redis绑定IP无效的问题,这时就需要进行相关的排查和解决。

问题描述

Redis绑定IP无效的具体表现是,即使我们在配置文件中设置了bind 参数并重启Redis,我们仍然可以通过任意IP地址连接Redis服务。这就会导致安全性问题和错误的访问。

排查过程

如果 Redis 绑定 IP 失败了,$redis-cli -h xx.xx.xx.xx 是可以连接的,这点很特殊,因为我们设置了 bind 很明显就是为了不让它随便要求连到 Redis 的,为什么还能连接呢?这里我们先来介绍一下 Redis 默认端口 6379 的网络监听策略:

backlog 设置为 511,即同时处理的连接数为 511;

so_reuseport 开启,允许多个进程同时进行绑定和监听;

tcp-backlog 为 somaxconn,默认情况下为 511。

了解了这些策略,我们就能进入到排查过程中。首先我们需要查看Redis的配置文件redis.conf 中bind参数的设置。

bind 127.0.0.1

如果这一步没找到问题,那就查看一下之前是否把 bind 注释掉了。如果 bind 参数设置的没问题,那么我们可以通过命令行执行netstat -lntp | grep 6379查看6379端口监听情况,并查看对应的 PID。

我们运行命令,发现Redis对应的PID是3203,这时我们就需要查看这个PID对应的进程详细信息,并排查可能影响绑定IP的进程。执行命令ps -ef | grep 3203查看Redis服务进程以及其所属的父进程信息。

从上述命令的返回结果中可以看到,Redis进程的父进程是Supervisor,而不是我们期望的init进程,这就可以解释为什么bind参数无效了:Supervisor进程在启动Redis时修改了bind参数,导致我们在redis.conf文件中设置的bind参数被覆盖。

解决方案

解决方法非常简单,只需要杀掉Supervisor进程,重新启动Redis即可。在此之前,需要先确保Redis.conf文件中的bind参数已经设置好。具体实现可以如下所示:

#查找supervisor进程号

ps -ef | grep supervisord | grep -v grep | awk ‘{print $2}’ | xargs -r kill -s SIGQUIT

#重启supervisor

supervisord

#重启Redis

redis-cli shutdown && redis-server /etc/redis/redis.conf

这段代码的作用就是先查找Supervisor的进程号,然后杀掉Supervisor进程,再重启Supervisor进程和Redis服务。

结语

Redis绑定IP无效是一个比较棘手的问题,但通过对问题的排查和解决,我们可以发现这个问题的根本原因是进程间的冲突。因此,在使用Redis的时候,我们应该注意进程之间的关系,避免因为进程间的冲突导致配置无效等问题。

相关文章