AWS redis外网无法访问问题解决过程

自学习记录,非教程,严禁转载!

问题描述:在AWS EC2上搭建了redis服务器,然后在本地写Java代码通过ShardedJedis连接测试基本的redis操作,但是一直连接不上Redis服务器。

解决过程:

  • 怀疑是端口问题,去http://ping.eu/port-chk/测了一下端口。IP地址填的是EC2实例的 IPv4公有IP,端口6379(EC2上Redis已经跑起来了),发现是closed,又试了一下22端口,发现22端口是open的(毕竟22是SSH端口,而且我已经在XShell一直都可以连上服务器,所以肯定应该是open的),又netstat -ap | grep 6379查看了一下服务器上的端口,6379确实在LISTEN状态。又试了Telent结果一样,22是通的,6379不通。AWS redis外网无法访问问题解决过程_第1张图片 图中是80端口,80端口也是未开放的端口。
  • 接下来一阵谷歌,发现可能是AWS的防火墙问题。AWS防火墙也就是安全组。在安全组中可以设置开放的端口,安装的时候有设置过,但是查看了一下发现22,80,25端口都是可以通过的,但是没有6379,于是把6379加到安全组中AWS redis外网无法访问问题解决过程_第2张图片 但是结果依然是无法访问端口。
  • 继续谷歌,发现linux也有自己的防火墙,而且ubuntu和centOS的防火墙查看指令还不一样,ubuntu用ufw status,查看防火墙状态 防火墙是inactive的。不放心把iptables直接卸载了,结果还是不行,端口依然不通。
  • 继续谷歌又发现一篇文章,说要更改redis.conf,把bind改成实际的IP地址,默认是127.0.0.1,但是redis.conf bind属性的注释是这样写的AWS redis外网无法访问问题解决过程_第3张图片如果不配置bind的话默认接受来自互联网的所有请求,而且redis本身并不建议不设置,但是还是决定先试一下。
  • 接下来有个插曲,AWS的IPv4地址每次重启服务器的时候都会变,是动态分配的,在解决这个问题的过程中也一度怀疑是不是和这个IP地址有关系,所以试了一下AWS提供的弹性IP也就是Elastic IP,就是在弹性IP的设置中分配一个新的地址,并把实例绑定上去就可以了,分配完之后IPv4的地址会变成弹性IP的地址,重启这个地址也不会发生变更,所以可以直接使用这个地址进行SSH连接,或服务器端口连接。
  • 继续上面的,在注释掉了了bind之后,重启redis。这个时候又出现了警告信息,警告没有截图,其实就是提示连接不安全,可以设置bind或开启访问密码,于是去redis.conf里开启了密码requirepass,这下再重启没有问题了,而且Telnet终于连接通过了                   AWS redis外网无法访问问题解决过程_第4张图片那这也基本上表示我在代码里已经可以通过Jedis进行连接了,果然,测试通过。
  • 但是依然遗留一个问题,就是上面的bind是注释掉的,这毕竟是不建议的操作,而且上面有说到把bind设置为实际的IP地址,所以试了一下,但是在重启redis的时候,启动失败了,Log里报错(没截图)
    Creating Server TCP listening socket xxx.xx.x.xxx:6379: bind: Cannot assign requested address
    又经过了一番谷歌,发现一篇文章http://m.1supin.com/it/wd/218/208497.html中写到,AWS在设置redis bind的时候要设置成AWS的私有IP,试了一下,竟然真的可以,虽然并不知道为什么这样配置的意思就是说,现在redis可以在服务器本地进行访问也可以通过外网IP进行访问,但是貌似并不能起到限制只有某些IP才能访问此redis的作用,可以通过上面说的设置redis password进行认证。

写在最后:

这次过程还是涉及很多内容,AWS用户组,弹性IP,linux端口查看指令,Telnet指令,redis bind配置,密码设置,对这些理解都有所加强。还有对端口的理解,服务器的80端口是默认访问端口,所以以后我把一套系统部署到AWS以后,把系统端口设置到80端口,这样在访问这个IP地址的时候进入的就是我们部署的系统,这一点之前一直不太理解。

你可能感兴趣的:(Redis)