最近做淘淘商城的一个项目,有很多地方用到了虚拟机,要在centos上搭建Nginx、FastDFS、Redis,集合每个模块都会遇到类似的问题,在这里总结一下。
我用的是CentOS 7.3(以下就简称c7了), win10,nginx-1.12.2,fastdfs-5.10、redis-4.0.8
我在这些服务安装时都遇到了防火墙的问题,而且时最烦人的,包括这里要说的redis。centos7和之前的版本在防火墙上有一些不同之处,网上的一些命令不能直接拿来用,iptables的许多操作都与centos6不同,就从这里说起。
以下命令对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
最直接简单的解决办法就是关闭iptables(当然之前的firewall也要关闭),命令在上边,这样所有的端口就都通了。要测试有没有通,不用你一直跑代码,很麻烦,直接使用win的telnet,进入cmd,命令如下
telnet host port
host就是虚拟机的ip,port是你需要测试的端口
如果出现以下问题,进入控制面板打开telnet
如果出现如下提示,说明访问不到端口(当然前提是要能ping通你的ip,要是连ip都ping不通的话这步是过不去的)
有反应,直接进入一个什么都没有的界面说明通了,我试了一下telnet 192.168.0.151 80(ip写你自己的),下图说明80端口是通的,其他端口也用这种方法测试。但是!!!!!!不一定你关了iptables就一定能telnet通你想要的端口,比如刚刚的redis的6379,此时我是关闭了iptables的,这个对于不同的端口就得再百度不同的解决方案了,但是记住,关闭防火墙或者说让虚拟机开放你指定的端口这是前提(开放指定的端口好像比较麻烦,这里有一篇文章,如果你想尝试,可能会有所帮助 https://segmentfault.com/a/1190000010713423)
第三步时关闭了iptables还是没有telnet通6379端口,因为缺少一步操作,修改redis.conf文件,如下,用#将bind这句注释掉,修改protected-mode 为no(这个设置为no的话就不需要密码就可以进入redis了)
再次telnet 192.168.0.151 6379,进入了,甚至可以直接操作redis,如下
这是我的测试代码
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...
都设置好之后就可以测试通过了