问题描述
昨晚在公司,本想通过远程连接测试下redis的benchmark的性能,并且跟自己修改源码实现的部分功能做对比,结果死活连接不上远程redis服务器!
系统配置:客户端ubuntu16.04 / 服务器tlinux 2.2 Redis都是4.0稳定版本
另外需要注意的是:服务器是公司的远程服务器,我们只能通过跳板机通过ssh从端口 36000 远程登陆该服务器。
连接方法
第一步:开启redis 允许外网IP 访问
在 Linux 中安装了redis 服务,当在客户端通过远程连接的方式连接时,报could not connect错误。
错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。
修改redis的配置文件redis.conf, 将配置文件中的bind 127.0.0.1
注释掉。
修改完后,服务器端需要使用配置文件重启
./redis-server ./redis.conf
第二步:修改配置文件中protected-mode
配置项
配置文件中protected-mode配置项默认开启yes,redis处于保护模式状态,会拒绝来自其它主机的连接。
解决方式:将protected-mode配置项设为no。
第三步:修改 服务器Linux 的防火墙(iptables),开启redis服务端口,默认是6379
注:这一步可选的!如果你的服务器防火墙有开放6379,那么你做完前面两步大概率就可以连接服务器进行操作了。
但是我用的公司远程服务器,然后登陆端口是36000, redis默认的6379端口估计没开,做完前面两步出现的问题是这样的:
(1)使用6379:./redis-cli -h 服务器ip -p 6379 出现拒绝连接的情况
(2)改用36000:./redis-cli -h 服务器ip -p 36000 连接成功了,但是。。。
如上图所示,这样子连接虽然连接成功,但是操作的时候,就报这两种错误:
Error: Protocol error, got "S" as reply type byte 和 Error: Connection reset by peer
注意这个时候服务器的配置文件中port是默认的6379,然后我把它改为36000,重新试,没用,还是这个错误。
最后我感觉是服务器防火墙可能是没开6379的端口,所以不允许客户端用这个端口访问,所以出现拒绝连接的情况。于是做出如下修改:
1 编辑防火强配置文件
vim /etc/sysconfig/iptables
2 添加一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
3 重启服务:
service iptables restart
当然我把配置文件中的port也改回了默认的6379,重启之后就可以用6379连接啦!
----------
当然还有一个问题:我最后防火墙允许6379访问,然后就能用6379连接并操作了,但是我之前用36000连接成功,但是操作失败,这是为什么呢?
既然能通过36000远程登陆该服务器,说明这个端口本来就是开着的,所以我能通过这个端口连接成功,但是操作的时候就失败咋回事还不清楚!