问题描述
我刚刚使用我的Ubuntu 10.10服务器上http://redis.io/topics/quickstart上的快速入门指南中的说明成功安装了Redis。我正在以dameon运行服务(因此可以通过init.d运行)
该服务器是具有内部和外部IP的Rackspace Cluster的一部分。主机在端口6379上运行(Redis的标准)
我在iptables中添加了一行以允许来自端口6379的传入连接,如下所示:
ACCEPT tcp -- anywhere anywhere tcp dpt:6379
在我在另一台服务器上的PHP代码中,我正在尝试连接到新的Redis服务器:
$this->load->helper("iredis");
$hostname = "IP ADDRESS HERE";
$redis = new iRedis(array('hostname' => $hostname, 'port' => 6379));
一旦我这样做 – 我总是拒绝连接。在我的redis.conf文件中,我将本地绑定命令注释掉,因此它应该监听的不仅仅是本地主机IP。我可以连接到本地计算机上的数据库,而不是在另一台服务器上。我已经尝试过外部和内部IP而没有运气。
有关使此工作的任何建议?
最佳解决方法
首先,我要检查以确认它正在监听您期望的IP:
netstat -nlpt | grep 6379
根据您的启动/停止方式,您可能没有实际重新启动实例。 netstat会告诉你它是否正在听你认为的地方。如果没有,请重新启动它并确保它重新启动。如果它重新启动但仍未按您的意愿收听,请检查配置文件以确定。
在建立之后,它正在监听您期望的位置,从应该具有访问权限的远程节点尝试:
redis-cli -h REMOTE.HOST ping
您也可以从本地主机尝试,但使用您希望它监听的IP而不是主机名或localhost。你应该在两种情况下看到它都是PONG。
如果没有,您的防火墙正在阻止您。这可能是本地IPTables,也可能是节点之间的防火墙。您可以向IPtables配置添加日志记录语句,以记录6379上的连接,以查看发生的情况。此外,尝试从本地和non-local重新ping到相同的IP应该是说明性的。如果它在本地但不是远程响应,我会依赖于on-node IP表规则的复杂性而倾向于干预防火墙。
次佳解决方法
我一直坚持同样的问题,前面的答案对我没有帮助(尽管写得很好)。
解决方案如下:检查您的/etc/redis/redis.conf
,并确保更改默认值
bind 127.0.0.1
至
bind 0.0.0.0
然后重新启动您的服务(service redis-server restart
)
然后,您现在可以检查redis是否正在侦听non-local界面
redis-cli -h 192.168.x.x ping
(用您的IP地址替换192.168.x.x)
重要说明:正如一些用户所说,在暴露于Internet的服务器上设置它是不安全的。您应确定redis受到任何符合您需求的方式的保护。
第三种解决方法
除了Orabîg给出的优秀答案:
我通过完全删除bind
部分并将protected-mode
设置为no
解决了这个问题。
#bind 127.0.0.1
protected-mode no
切勿在公开的服务器上使用此方法。
第四种方法
Orabig是对的。
您可以在Ubuntu(VirtualBox)中绑定10.0.2.15,然后执行从主机到来宾Ubuntu的端口转发。
在/etc/redis/redis.conf中
bind 10.0.2.15
然后,重启redis:
sudo systemctl restart redis
它应该工作!