Redis-连接到远程服务器


122

我已经按照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都没有运气。

有什么建议让它起作用吗?


您可以使用Redis命令行工具进行连接吗?redis-cli -h hostname
jlundqvist 2011年

服务器故障有一个有关“ 连接被拒绝”的规范问题。
Raedwald 2015年

Answers:


129

首先,我要检查一下它是否正在侦听您期望的IP:

netstat -nlpt | grep 6379

根据您启动/停止的方式,您可能实际上并未以您认为的实际方式重新启动实例。netstat会告诉您是否正在侦听您认为的位置。如果没有,请重新启动它并确保它重新启动。如果重新启动但仍未在您期望的位置进行侦听,请检查配置文件以确保。

建立之后,它正在从应该具有访问权限的远程节点上监听您期望的位置:

redis-cli -h REMOTE.HOST ping

您也可以从本地主机尝试该操作,但是使用您希望其监听的IP地址而不是主机名或本地主机。在两种情况下,您都应该看到它是PONG。

如果没有,则您的防火墙正在阻止您。这可能是本地IPTable,也可能是节点之间的防火墙。您可以将日志记录语句添加到IPtables配置中,以记录6379上的连接以查看发生了什么。同样,尝试从本地和非本地重新映射到同一IP应该是说明性的。如果它在本地响应而不是在远程响应,则我倾向于使用介入式防火墙,具体取决于您的节点上IP表规则的复杂性。


16
因此,很明显,您正在拒绝发布的问题的答案,因为您有一个相关(但显然不完全相同)的问题无法解决?虽然我同意发布您的解决方案,但由于您的问题不同,所以拒绝正确答案似乎不是正确的选择。就是说,您的解决方案不是问题的最佳选择,因为OP具有多个IP,并且可能不想监听所有IP,并且OP专门在问题的配置文件中引用了bind部分。因此,您的解决方案无法解决所提出的问题。
真实法案

2
好吧,我又读了一个问题,对我来说似乎并不那么明显,OP为该“绑定”行设置了正确的conf。另外,我不确定他的案件涉及任何防火墙。无论如何,如果您觉得不礼貌,我可以删除我的-1。我刚刚发现,你的答案是完全偏离主题,而且会为广大用户来这里有一个很常见的问题...(绑定默认参数)不是非常有帮助
Orabîg

1
OP确实说他注释掉了本地绑定规则,该规则告诉redis绑定到系统上的所有地址。我不会称呼-1粗鲁,只是不合适。OP明确表示他已经制定了IPtables规则,因此很明显在提出的问题中已经有防火墙规则。考虑到所声明的防火墙的存在和配置中本地绑定的删除,您的答案与所问的问题不正确或无关。
真实法案

是的,您是对的,对不起。我不是英语母语人士,并且误解了“ comment out”动词...我认为OP已“删除”了该评论。(不幸的是,我不能删除我-1,除非您修改后)
Orabîg

不用担心,它发生了。我添加了一些关于验证它是否在您希望的位置运行的说明。希望这有助于将来的读者澄清它。
真实法案

327

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

解决方案在这里:检查您的/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.xx)

重要说明:如几个用户所述,在暴露于Internet的服务器上进行设置并不安全。您应该确定自己的Redis受到适合您需求的任何方式的保护。


1
同样,在考虑防火墙设置或网络问题之前,您应该首先允许来自Redis服务器的远程连接。感谢Orabig
securecurve 2013年

这是显而易见的正确答案。上面的那个有很多技术上的系统管理员“黑暗艺术”,无影无踪……但这根本没有帮助:)
Henley Chiu

7
此问题与OP不同。OP特别声明他们已经对配置文件进行了更改。由于OP对配置文件进行了更改,因此您做了。不是,这是两个独立的问题。给出的答案解决了所提供的问题。并不是要解决所有问题。一个人问。这并不是要承认任何错误,而是要意识到您的问题有所不同。这就像有人说他们的车不会启动,但里面有汽油,而您告诉他们他们需要汽油。
真实法案,

1
您还会知道如何指定IPv4和IPv6双协议栈吗?我试过如下:bind 0, ::bind 0, [::]bind 0\nbind6 ::(其中\ n是一个换行符),并bind 0 [::]但作品是不是有一个唯一bind在所有配置行。它默认为侦听0(或0.0.0.0/0)和[::],所以没有问题,但是我想知道我曾经需要的正确方法。它似乎没有记录在任何地方。
2014年

7
这个答案的作用是使您的Redis服务器可被世界访问。那是很大的安全风险。如果这样做,请确保以其他方式锁定Redis服务器,例如在Redis中添加AUTH密码并配置防火墙(例如iptables)以阻止未经授权的客户端。
sffc 2014年

14

除了Orabîg提供的出色答案之外:

我通过bind完全删除该部分并将设置protected-mode为来解决了此问题no

#bind 127.0.0.1
protected-mode no

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


1
对于使用不安全方法的任何人:请保护您的Redis服务器!否则您将丢失所有文件:(我的服务器已受到威胁,因为我没有保护Redis Server。攻击者想要我支付一些钱(对我来说足够大)。攻击者是这样的:duo.com/博客/…
MonkimoE

4

Orabig是正确的。

您可以在Ubuntu(VirtualBox)中绑定10.0.2.15,然后执行从主机到来宾Ubuntu 的端口转发

在/etc/redis/redis.conf中

bind 10.0.2.15

然后,重新启动redis:

sudo systemctl restart redis

它将起作用!


4

几天来,我一直在与Redis进行远程连接。终于我做到了。这是我整理并遵循的完整检查清单。上面的答案中给出了一些解决方案。但是我希望我的回答是关于这个主题的纳米维基:)我也添加了一些有用的链接。

如果redis在本地可用:

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

如果未设置密码

请参阅/etc/redis/redis.confconfig(这是Ubuntu 18.04的默认位置,您可以将其放在其他位置):

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

如果在配置中将保护模式设置为“否”:

# The following line should be uncommented
protected-mode no

如果在配置中打开了IP绑定以便从Internet访问:

# 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
$

如果您可以通过作为远程服务器连接的Internet服务器对您的Redis服务器执行ping-PONG操作,则远程Redis连接将起作用。

安全警告

以上所有内容使您的Redis数据对互联网上的任何人都完全开放。

要基本保护Redis的使用requirepassprotected-mode yesRedis config中的设置(请参阅上文)并阻止危险的Redis命令(请参阅上面的链接),如需更深入的了解,请参阅本文Redis站点安全性部分)。

有用的链接

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

希望能帮助到你。


2
  • 如果您自己下载了redis(不是apt-get install redis-server),然后根据上述建议编辑了redis.conf,请确保使用以下配置启动redis :./src/redis-server redis.conf

    • 还需要注意的是,如果您在Windows上并连接到virtualbox vm,则我将包括一个虚拟框设置的屏幕快照以连接到redis。

在此处输入图片说明


0

在服务器的redis配置中将tcp-keepalive设置为60(将其设置为0)可以帮助我解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.