java连接虚拟机中redis报错
【问题背景】:1)、vmware中安装的redis-4.0.10,且redis启动连接正常。
2)、虚拟机中网络选择的桥接模式(复制物理网络连接状态)
【问题描述】:通过java代码测试链接虚拟机中redis,测试执行ping是否可以正常返回PONG。执行后报连接被拒绝的错误,具体如下。
1)、测试代码
public class TestPing
{
public static void main(String[] args)
{
Jedis jedis = new Jedis("192.168.1.114", 6379);
System.out.println(jedis.ping());
}
}
2)、报错信息
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
at redis.clients.jedis.Connection.connect(Connection.java:164)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
at redis.clients.jedis.Connection.sendCommand(Connection.java:100)
at redis.clients.jedis.Connection.sendCommand(Connection.java:95)
at redis.clients.jedis.BinaryClient.ping(BinaryClient.java:93)
at redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:105)
at com.demo.redis.test.TestPing.main(TestPing.java:10)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at redis.clients.jedis.Connection.connect(Connection.java:158)
... 6 more
【问题定位】:该问题从如下几点出发考虑:绑定地址是否正确;安全模式配置是否正确;防火墙是否关闭
如下说明仅适用于测试使用,不适用于有一定安全策略要求的生产环境
1) bind地址绑定
查看redis的配置文件,可知bind 配置的是 redis server 网卡的地址 ,通过配置的对应网卡地址方位redis,其他的外部IP无法访问。
通过命令可查询到虚拟机有两个网卡,lo对应的回环地址127.0.0.1,eth0对应的192.168.1.114
而redis.conf配置文件中bind只配置了 bind 127.0.0.1,一般会将此项配置为 bind 127.0.0.1 192.168.1.114,但是做绑定后其他跨服务器的IP访问就会失败,因为基于linux的网络安全策略管理,6379端口已经被绑定到了指定IP,如127.0.0.1 (本机)后,只有指定的机器的请求能访问,其他的外部请求会被拒绝过滤。
所以此处将redis.conf中的bind配置修改为 bind 0.0.0.0。即所有地址均可访问。(线上生产环境建议绑定IP)
#bind 127.0.0.1
bind 0.0.0.0
配置完步骤1后,测试就已经可以通过了,如过不能测试通过,查看后面步骤。
2、修改安全模式配置
redis3.2以上的版本新增了 protected-mode no 的保护模式配置,默认为yes,在外部ip连接redis时会提示没有绑定ip,没有授权密码。
此处我们将保护模式配置为no即可。
如果还不行,可考虑关闭一下防火墙。
3、关闭防火墙
查看防火墙状态及暂时关闭防火墙:
systemctl status firewalld
systemctl stop firewalld
如果报错systemctl comand not found,可执行如下命令:
service iptables status
service iptables stop
最好能设置一下防火墙默认关闭:chkconfig iptables off,在执行上面的防火墙命令后再执行这一行代码,意思好像是开机不自动启动防火墙.
前提是你的虚拟机是可以正常访问外网的.
重新运行代码测试,控制台正常输出PONG