Redis - 连接远程服务器

129

我刚刚按照 http://redis.io/topics/quickstart 快速入门指南上的说明,在我的Ubuntu 10.10服务器上成功安装了Redis。我将Redis作为守护进程运行(以便可以通过init.d运行)。

该服务器是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地址。我可以在本地计算机上连接到数据库,但无法在其他服务器上连接。我尝试了外部和内部IP地址,但都没有成功。

有没有建议可以让这个工作起来?


你能使用Redis命令行工具连接吗?redis-cli -h 主机名 - jlundqvist
Server Fault有一个关于“连接被拒绝”(Connection Refused)的规范问题,链接为http://serverfault.com/questions/725262/what-causes-the-connection-refused-message。 - Raedwald
7个回答

335

我遇到了同样的问题,之前的答案没有帮助到我(尽管写得很好)。

解决方案在这里:检查你的 /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受到适合您需求的任何保护措施。


1
同样的问题,你应该首先允许来自Redis服务器的远程连接,然后再考虑防火墙设置或网络问题。谢谢Orabig。 - securecurve
这是显而易见的正确答案。上面那个回答充斥着许多技术系统管理员的“黑魔法”迷信说辞...但它根本没有任何帮助 :) - Henley
7
这个问题与原帖不同。原帖明确说明他们已经对配置文件进行了必要的更改。既然原帖已经更改了配置文件而你没有,那么这就是两个不同的问题。回答给出了提供的问题的解决方案,而不是针对所有问题。这不是承认有什么错,而是意识到你的问题是不同的。这就好像有人说他们的车启动不了,但是油箱里有油,你告诉他们需要加油一样。 - The Real Bill
1
你是否知道如何指定IPv4和IPv6双栈?我尝试了以下几种方法:bind 0, ::bind 0, [::]bind 0\nbind6 ::(其中\n表示换行符)和bind 0 [::],但是唯一有效的方法是在配置中不包含bind行。它默认侦听0(或0.0.0.0/0)和[::],所以没有问题,但如果需要,我想知道正确的方法。似乎没有任何文档记录这个问题。 - Luc
7
这个答案的作用是让你的Redis服务器对全球都可见。这是一个很大的安全风险。如果你这样做了,请确保通过其他方式来锁定你的Redis服务器,例如在Redis中添加AUTH密码,以及配置你的防火墙(例如iptables)来阻止未经授权的客户端。 - sffc
显示剩余6条评论

130

首先,我会检查确认它正在监听您期望的IP地址:

netstat -nlpt | grep 6379

根据您启动/停止的方式,您可能并没有在您认为已经重新启动实例时重新启动它。netstat将告诉您它是否在您认为它应该监听的地方。如果不是,请重新启动它并确保它重新启动。

如果它重新启动但仍未在您预期的位置监听,请检查您的配置文件以确保无误。

在确认它正在您希望它监听的位置进行监听后,从具有访问权限的远程节点尝试:

redis-cli -h REMOTE.HOST ping

你也可以尝试在本地主机上使用期望它监听的IP,而不是使用主机名或本地主机名。在这两种情况下,你应该会看到PONG响应。

如果没有看到响应,则可能是防火墙阻止了你的连接。这可能是本地的IPTables,也可能是节点之间的防火墙。你可以将日志记录语句添加到IPtables配置中,以记录6379端口的连接情况,以查看发生了什么。此外,从本地和非本地尝试对同一IP执行Redis ping操作可能会更具有说明性。如果在本地有响应但远程无响应,则根据节点IP Tables规则的复杂程度,我倾向于是介于其间的防火墙问题。


17
为了明确,您对这个问题发布的答案进行了负评,因为您有一个相关但显然不同的问题它没有解决?尽管我赞成发布您的解决方案,但是因为您的问题不同而对正确的答案进行负评似乎不合适。话虽如此,您的解决方案并不适合这个问题,因为OP有多个IP地址,可能不想在所有IP上都进行监听,并且OP在问题中特别提到了配置文件中的绑定部分。因此,您的解决方案没有回答所提出的问题。 - The Real Bill
2
好的,我再次阅读了问题,对我来说并不明显OP是否为这个“bind”行设置了正确的配置。此外,我不确定在他的情况下是否涉及任何防火墙。无论如何,如果您认为这很粗鲁,我可以取消我的-1。我只是发现你的回答完全离题,并且对于来到这里的大多数用户来说并没有什么帮助...(绑定默认参数) - Orabîg
1
OP确实说他注释掉了本地绑定规则,这告诉redis绑定到系统上的所有地址。我不会称-1为粗鲁,只是不合适。OP明确表示已经有IPtables规则,因此在所提出的问题中很明显存在防火墙规则。考虑到防火墙的存在和配置文件中本地绑定的删除,你的答案对于所提出的问题来说是不正确或不相关的。 - The Real Bill
是的,你说得对,抱歉。我不是以英语为母语,误解了“注释掉”这个动词...我以为OP已经“删除”了注释。(不幸的是,在你编辑帖子之前,我无法取消我的-1) - Orabîg
没关系,这是常有的事情。我添加了一些说明,以确保它在你想要的位置运行。希望这能帮助未来的读者理解清楚。 - The Real Bill
显示剩余2条评论

15
除了Orabîg提供的出色答案之外:
我通过完全删除 "bind" 部分并将 "protected-mode" 设置为 "no" 来解决了这个问题。
#bind 127.0.0.1
protected-mode no

永远不要在公开的服务器上使用此方法。


1
对于使用未加密方法的任何人:请保护您的Redis服务器!!否则,您将失去所有文件:(我的服务器已被攻击者入侵,因为我没有保护Redis服务器。攻击者要求我支付一定金额的赎金(对我来说相当巨大)。攻击者类似于这样:https://duo.com/blog/over-18000-redis-instances-targeted-by-fake-ransomware - MonkimoE

8

我曾经苦恼于连接Redis远程服务器的问题,历经多日,最终成功了。这里是我整理的完整检查清单,可供参考。其中一些解决方案已在上面的答案中提供。但我想让我的答案成为该主题的小型百科全书:) 我还添加了一些有用的链接。

如果Redis在本地可用:

$ redis-cli
127.0.0.1:6379>ping
PONG
127.0.0.1:6379>

如果未设置密码

查看/etc/redis/redis.conf配置文件(这是Ubuntu 18.04的默认位置,您可能有不同的位置):

# The following line should be commented
# requirepass <some pass if any>

如果配置中的受保护模式设置为“否”:

# The following line should be uncommented
protected-mode no

如果在配置中开放了IP绑定以允许从互联网访问:
# The following line should be commented
# bind 127.0.0.1 ::1

如果Linux防火墙允许连接

(适用于Ubuntu 18.04)请检查是否允许传入的互联网流量进入端口6379(Redis默认端口)。

# To check if it the port is open
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
6379/tcp                   ALLOW       Anywhere
6379/tcp (v6)              ALLOW       Anywhere (v6)
...

# To open the port
$ sudo ufw allow 6379/tcp

重启 Redis 服务

别忘了重启 Redis 服务以使更改生效并检查其是否正在运行:

$ sudo systemctl restart redis.service
$ sudo systemctl status redis

检查它是否作为远程服务器工作

从你的命令行使用redis-cli,就好像Redis服务器在远程服务器上一样:

$ redis-cli -h <your-server-ip>
<your-server-ip>:6379> ping
PONG
<your-server-ip>:6379> exit
$

如果您可以通过连接在远程服务器上的互联网服务器来ping-pong您的Redis服务器,则远程Redis连接有效。

安全警告

以上所有操作都会使您的Redis数据完全暴露于任何人之下。

为了基本保护Redis,请在Redis配置中使用requirepassprotected-mode yes设置(请参见上文),并阻止危险的Redis命令(请参见上面的链接),如需更深入地了解,请参见此文章Redis站点安全性部分)。

有用的链接

一些链接可帮助 you 在Ubuntu 18.04上安装和保护Redis以及如何设置Ubuntu 18.04防火墙

希望能对您有所帮助。


4

Orabig是正确的。

您可以在Ubuntu(VirtualBox)中绑定10.0.2.15,然后从主机到客户端Ubuntu进行端口转发

在/etc/redis/redis.conf中。

bind 10.0.2.15

接下来,重新启动Redis:

sudo systemctl restart redis

它应该能够正常工作!


2
  • 如果你是自己下载了Redis(不是通过apt-get install redis-server安装的),并且按照上述建议编辑了redis.conf,请确保你使用配置文件启动Redis,方法如下:./src/redis-server redis.conf

    • 另外一点需要注意:如果你在Windows上连接到VirtualBox VM,请参考以下截图设置连接Redis。

enter image description here


0
在服务器的Redis配置中将tcp-keepalive设置为60(原来是0)有助于解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接