2011-12-16 185 views
99

我刚刚在我的Ubuntu 10.10服务器上使用http://redis.io/topics/quickstart上的快速入门指南中的说明成功安装了Redis。我以dameon的身份运行该服务(因此它可以由init.d运行)Redis - 连接到远程服务器

该服务器是Rackspace集群的一部分,包含内部和外部IP。主机在端口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,没有运气。

任何建议让这个工作?

+0

您能否使用Redis命令行工具进行连接? `redis-cli -h hostname` – jlundqvist 2011-12-27 16:54:06

+0

服务器故障有一个关于[Connection Refused]的规范问题(http://serverfault.com/questions/725262/what-c​​auses-the-connection-refused-message)。 – Raedwald 2015-09-30 12:32:35

回答

107

首先我会检查,以确认它的IP地址听你希望它是:

netstat -nlpt | grep 6379 

取决于你如何启动/停止,你可能没有真正重新启动实例时,你以为你有。 netstat会告诉你它是否在听你认为的地方。如果没有,请重新启动并确保重新启动。 如果它重新启动并且仍然没有在您期望的位置进行监听,请检查您的配置文件以确保安全。

redis-cli -h REMOTE.HOST ping 

您也可以尝试从本地主机,但使用的IP,你希望它是:

建立它在听,你指望它,从中应该可以访问尝试远程节点后监听而不是主机名或本地主机。在这两种情况下,你都应该看到PONG的反应。

如果不是,您的防火墙将阻止您。这可能是本地IPTables,也可能是节点之间的防火墙。你可以在你的IPtables配置中添加一条日志语句来记录6379以上的连接,看看发生了什么。另外,试图从本地和非本地到相同的IP重新进行ping应该是说明性的。如果它在本地响应但不是远程响应,那么根据您的节点IP表规则的复杂性,我会倾向于插入防火墙。

+16

所以,很明显,您对所发布的问题回答了一个错误的答案,因为您有一个它没有解决的相关(但显然不相同)的问题?虽然我同意发布您的解决方案,但由于您的问题有所不同,所以低估了正确的答案似乎并不适合。也就是说,你的解决方案对于这个问题不是一个好的选择,因为OP有多个IP地址,可能不想听所有的IP地址,而且OP特别引用了问题中配置文件中的bind部分。因此你的解决方案不能解决问题。 – 2013-01-17 21:19:50

+2

好吧,我再次读到这个问题,对我来说,OP并没有为这个“绑定”行设置正确的配置。另外,我不确定他的情况是否涉及任何防火墙。无论如何,如果你认为这很粗鲁,我可以删除我的-1。我刚刚发现你的答案完全是无关紧要的,并且对于大多数用户来到这里带来一个非常常见的问题没有什么帮助......(绑定默认参数) – 2013-01-17 22:47:46

278

我一直坚持相同的问题,前面的答案没有帮助我(虽然写得很好)。

的解决方案是在这里:检查你的/etc/redis/redis.conf,并确保更改默认

bind 127.0.0.1 

bind 0.0.0.0 

然后重新启动服务(service redis-server restart

然后,您可以现在检查redis是否在非本地接口上收听

redis-cli -h 192.168.x.x ping 

(与你的IP地址替换192.168.x.x)

重要提示:几个用户所说的那样,是不安全设置这个被暴露在互联网的服务器上。您应该确定您的redis受到任何适合您需求的手段的保护。

0

在服务器的redis配置中将tcp-keepalive设置为60(它被设置为0)帮助我解决了这个问题。

8

除了由Orabîg给出的出色答卷:

我被彻底消除了bind部分和设置protected-modeno解决了这个问题。

#bind 127.0.0.1 
protected-mode no 

切勿在公开的服务器上使用此方法。

1
  • 如果您下载Redis的自己(不易于得到安装Redis的服务器),然后编辑redis.conf与 上述建议,确保开始Redis的的配置 像这样: ./src/redis-server redis.conf

    • 也侧面说明我包括虚框设置为 的截图连接到Redis的,如果你是在Windows和连接到VirtualBox的虚拟机。

enter image description here

0

Orabig是正确的。

可以绑定在10.0.2.15 Ubuntu的(VirtualBox的)然后做一个端口从主机到来宾Ubuntu的转发。在/etc/redis/redis.conf

bind 10.0.2.15 

然后,重新启动的Redis:

sudo systemctl restart redis 

它应努力!