解决连接虚拟机的Redis时出现的拒绝访问和超时的问题

最近做淘淘商城的一个项目,有很多地方用到了虚拟机,要在centos上搭建Nginx、FastDFS、Redis,集合每个模块都会遇到类似的问题,在这里总结一下。

1、环境

我用的是CentOS 7.3(以下就简称c7了), win10,nginx-1.12.2,fastdfs-5.10、redis-4.0.8

我在这些服务安装时都遇到了防火墙的问题,而且时最烦人的,包括这里要说的redis。centos7和之前的版本在防火墙上有一些不同之处,网上的一些命令不能直接拿来用,iptables的许多操作都与centos6不同,就从这里说起。

2、iptables

以下命令对c7就不是很有效,因为/etc/init.d/下没有iptables文件

$ /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT  
$ /etc/init.d/iptables save  
$ /etc/init.d/iptables restart

这是一篇说的挺详细的将iptables和firewall的,以及他们的切换

http://blog.csdn.net/xlgen157387/article/details/52672988

我的操作,因为我不知道虚拟机上的iptables现在是个什么状态

直接重装

yum install iptables

启动

/bin/systemctl start iptables.service

关闭

/bin/systemctl start iptables.service

有说是这样操作的,但是行不通,可能就是因为c7版本的问题吧

service iptables start
service iptables restart
service iptables stop

3、解决各种服务端口没有打开的问题

最直接简单的解决办法就是关闭iptables(当然之前的firewall也要关闭),命令在上边,这样所有的端口就都通了。要测试有没有通,不用你一直跑代码,很麻烦,直接使用win的telnet,进入cmd,命令如下

telnet host port

host就是虚拟机的ip,port是你需要测试的端口

如果出现以下问题,进入控制面板打开telnet

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第1张图片

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第2张图片

如果出现如下提示,说明访问不到端口(当然前提是要能ping通你的ip,要是连ip都ping不通的话这步是过不去的)

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第3张图片

有反应,直接进入一个什么都没有的界面说明通了,我试了一下telnet 192.168.0.151 80(ip写你自己的),下图说明80端口是通的,其他端口也用这种方法测试。但是!!!!!!不一定你关了iptables就一定能telnet通你想要的端口,比如刚刚的redis的6379,此时我是关闭了iptables的,这个对于不同的端口就得再百度不同的解决方案了,但是记住,关闭防火墙或者说让虚拟机开放你指定的端口这是前提(开放指定的端口好像比较麻烦,这里有一篇文章,如果你想尝试,可能会有所帮助 https://segmentfault.com/a/1190000010713423)

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第4张图片

4、修改redis.conf文件

第三步时关闭了iptables还是没有telnet通6379端口,因为缺少一步操作,修改redis.conf文件,如下,用#将bind这句注释掉,修改protected-mode 为no(这个设置为no的话就不需要密码就可以进入redis了)

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第5张图片      

再次telnet 192.168.0.151 6379,进入了,甚至可以直接操作redis,如下

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第6张图片

5、代码及报错

这是我的测试代码

public class JedisTest {
	
	@Test
	public void testJedisSingle() throws Exception {
		// 创建Jedis对象
		Jedis jedis = new Jedis("192.168.0.151", 6379);
//		Jedis jedis = new Jedis("127.0.0.1", 80);
		
		jedis.set("hello", "world");
		String world = jedis.get("hello");
		System.out.println(world);
		
		jedis.close();
	}

}

注意:redis.conf每次修改完之后都要重新启动redis,进入redis的安装目录,比如我的是 /usr/local/redis/bin 关闭和启动redis的命令如下

./redis-cli shutdown
./redis-server redis.conf

6379未开放时,报错-超时

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

6379开放,bind未注释掉,报错-拒绝访问

redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect

6379开放,bind注释掉,protected-mode为yes,报错-处于保护模式不能访问

redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled...

都设置好之后就可以测试通过了

解决连接虚拟机的Redis时出现的拒绝访问和超时的问题_第7张图片


你可能感兴趣的:(一些恼人的bug的处理办法)