Redis绑定IP无效疑难杂症(redis绑定IP没生效)
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的时候,我们应该注意进程之间的关系,避免因为进程间的冲突导致配置无效等问题。
相关文章