---------------------------------------------------2021-11-20更新----------------------------------------------------------
问题出现的场景:在云服务器上安装并启动了redis之后,使用telnet命令发现本地计算机始终无法访问redis服务端口
今天在折腾新的云服务器时,又遇到了这个奇怪的问题,突然想起这篇记录,再次梳理一下问题出现的前因后果及解决办法
首先需要保证的是(以下条件缺一不可):
- 服务器上新装的redis是启动成功的
- 云服务器的防火墙是开启的且开放了6379端口
- 云厂商控制台的防火墙策略开放了6379端口(我这里用的是腾讯云)
(tips:如果此时提示“FirewallD is not running”,参考文章末尾开启防火墙文章链接)
此时发现我本地的机器不能访问通这个端口
乍一看又使我懵逼了一下,然而看了以前自己写的解决方案之后就全想起来了哈哈,同时注意到了下面的细节
于是打开服务器上的redis.conf文件一看,好家伙,果然是这个127.0.0.1惹的祸
上面一大堆英文注释的大致意思是为了不让该redis暴露给所有人,默认情况下通过“bind 127.0.0.1”来限制只能与redis同一主机的客户端来连接它,如果你确定要将该redis实例监听所有的端口,注释这一行即可。于是,我将这一行注释了,重启redis之后发现,还是不能访问该端口,这个时候就又纳闷了,等等,我好像看到了什么
如上图,就在”bind 127.0.0.1“的下面,有一个”protected-mode yes“的配置,阅读一下它上面的注释,不难发现,这个配置是一种安全的保护机制,为了避免redis实例暴露给互联网,当bind没有绑定具体的地址(即注释掉)且未配置redis密码时,该redis服务只监听127.0.0.1和::1或者来自Unix的套接字,如果你确定要在没有配置密码且没有使用bind配置显式的绑定接口的情况下让其他客户端连接到该redis,那么,就禁用该保护。
注释已经讲的很清楚了嘛,于是我将”bind 127.0.0.1“再次注释掉且将设置改为“protected-mode no”如下图:
保存redis.conf并退出,重启redis服务,在自己电脑上使用"telnet 云服务器IP 6379",访问成功!
当然,为了安全起见,还是建议通过下面的那种方式,绑定云服务器内网IP,最终我还是选择了下面那种方式hhh
总结下来使云服务器redis端口能够被公网访问有以下两种方式:
- 修改redis.conf文件中“bind 127.0.0.1”为“bind [你自己云服务器的内网地址]”(推荐,步骤见下文)
- 修改redis.conf文件,注释“bind 127.0.0.1”并将“protected-mode yes”改为“protected-mode no”(步骤见上文)
---------------------------------------------------2021-11-20更新----------------------------------------------------------
如上图,我在redis.conf的bind配置了本机的公网ip,之后启动redis服务发现服务并没有跑起来,将bind地址改为127.0.0.1之后又可以跑起来了,很奇怪。查了半天资料才发现原来是这个地址配置的有错,不能写公网ip,而是要通过ifconfig得到内网ip:
将这个地址配置到bind之后,使用ps -ef|grep redis 或 netstat -anp|grep 6379 发现服务确实已经启动了,但是我用本地的机器telnet该redis的6379端口时连接超时
于是想到可能是服务器的端口没开放的原因,便开放了6379端口再次telnet,连接成功!开放端口命令见:centos7开放指定端口以及查看防火墙已开启端口命令