java连接虚拟机中redis报错Connection refused: connect

问题背景】: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

重新运行代码测试,控制台正常输出PONG,如下

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值