java连接虚拟机中redis报错

问题背景】:1)、vmware中安装的redis-4.0.10,且redis启动连接正常。

img

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地址绑定

img

查看redis的配置文件,可知bind 配置的是 redis server 网卡的地址 ,通过配置的对应网卡地址方位redis,其他的外部IP无法访问。

img

通过命令可查询到虚拟机有两个网卡,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,没有授权密码。

img

此处我们将保护模式配置为no即可。

如果还不行,可考虑关闭一下防火墙。

3、关闭防火墙

查看防火墙状态及暂时关闭防火墙:

systemctl status firewalld

systemctl stop firewalld

如果报错systemctl comand not found,可执行如下命令:

service iptables status

service iptables stop

最好能设置一下防火墙默认关闭:chkconfig iptables off,在执行上面的防火墙命令后再执行这一行代码,意思好像是开机不自动启动防火墙.

前提是你的虚拟机是可以正常访问外网的.

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

posted @ 2022-11-27 10:43  哩个啷个波  阅读(98)  评论(0编辑  收藏  举报