gpt4 book ai didi

python - 无法从 Python 连接到在 Azure Linux VM 上运行的 Redis 实例

转载 作者:可可西里 更新时间:2023-11-01 11:14:51 29 4
gpt4 key购买 nike

我在 Azure 上创建了一个 Ubuntu 虚拟机。在其入站网络过滤器中,我添加了端口 22(用于 SSHing)和 6379(用于 Redis)。在此之后,我从我的 bash shell SSHed 进入一个实例,从源代码下载、构建和安装 Redis。生成的 redis.conf 文件位于 /tmp/redis-stable 中,因此我对其进行了编辑以注释掉 bind 127.0.0.1 规则.

然后我在/tmp/redis-stable目录下启动redis-server redis.conf,启动正常,接着SSH进入 VM 的另一个实例,启动 redis-cli 并设置一些键。检索它们,正常工作。

现在在 Python 中我运行这个命令:

r = redis.Redis(host='same_which_I_use_for_SSHing', port=6379, password='pwd')

它立即连接(看起来很奇怪)。但是当我尝试像 r.get("foo") 这样的简单命令时,我得到了这个错误:

>>> r.get("foo")
Traceback (most recent call last):
File "/lib/python3.5/site-packages/redis/connection.py", line 484, in connect
sock = self._connect()
File "/lib/python3.5/site-packages/redis/connection.py", line 511, in _connect
socket.SOCK_STREAM):
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/socket.py", line 732, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/lib/python3.5/site-packages/redis/client.py", line 667, in execute_command
connection.send_command(*args)
File "/lib/python3.5/site-packages/redis/connection.py", line 610, in send_command
self.send_packed_command(self.pack_command(*args))
File "/lib/python3.5/site-packages/redis/connection.py", line 585, in send_packed_command
self.connect()
File "/lib/python3.5/site-packages/redis/connection.py", line 489, in connect
raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 8 connecting to username@ip_address. nodename nor servname provided, or not known.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/lib/python3.5/site-packages/redis/connection.py", line 484, in connect
sock = self._connect()
File "/lib/python3.5/site-packages/redis/connection.py", line 511, in _connect
socket.SOCK_STREAM):
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/socket.py", line 732, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/python3.5/site-packages/redis/client.py", line 976, in get
return self.execute_command('GET', name)
File "/lib/python3.5/site-packages/redis/client.py", line 673, in execute_command
connection.send_command(*args)
File "/lib/python3.5/site-packages/redis/connection.py", line 610, in send_command
self.send_packed_command(self.pack_command(*args))
File "/lib/python3.5/site-packages/redis/connection.py", line 585, in send_packed_command
self.connect()
File "/lib/python3.5/site-packages/redis/connection.py", line 489, in connect
raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 8 connecting to username@ip_address. nodename nor servname provided, or not known.

知道如何解决这个问题吗?仅供引用,错误消息中的 username@ip_address 与我分别从 bash 用于 SSH 和从 Python 连接到 Redis 相同:

ssh username@ip_address
r = redis.Redis(host='username@ip_address', port=6379, password='pwd')

在注释掉 bind 127.0.0.1 行后,我还尝试在 redis.conf 文件中添加 bind 0.0.0.0。相同的结果。

更新:我尝试在配置文件中将保护模式设置为 no,然后在虚拟机中运行 sudo ufw allow 6379。还是一样的结果。但是现在我在运行 redis-server redis.conf 时遇到了一个奇怪的错误。我没有得到显示为图形的典型 redis 多维数据集相反,我得到了这个:

enter image description here

在此之后,如果我输入 redis-cli 并发出像 set foo boo 这样的简单命令,我会收到此错误消息:

127.0.0.1:6379> set foo 1
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

此后即使关机也会失败。我必须运行 grep 来找到 redis-server 的进程并手动杀死它,然后需要运行 redis-server 命令才能正常启动它。但当然,我仍然无法从远程 Mac 连接。

最佳答案

我尝试在 Azure 上创建一个 Ubuntu VM,从源代码构建和配置 redis 服务器,并在 Azure 门户上为我的 VM NSG 添加端口规则,然后我通过相同的代码与 python redis 包成功连接了 redis 服务器.

这是我的步骤如下。

  1. 在 Azure 门户上创建 Ubuntu 18.04 VM。
  2. 通过SSH连接Ubuntu虚拟机安装构建包(包括build-essentialgccmake),下载并解压tar.gz 来自 redis.io 的 redis 源代码文件,并使用 makemake test< 构建和测试 redis 服务器
  3. 通过vim配置redis.conf,将bind配置从127.0.0.1更改为0.0.0.0
  4. Settings -> Networking 选项卡中显示的 Network Interface 添加带有 TCP 的 6379 端口的新端口规则到 NSG我在 Azure 门户上的 VM,如下图所示。

enter image description here注意:在我的 Networking 选项卡中有两个 NSG,第二个与我的 Network Interface 相关,可以通过互联网访问。 enter image description hereenter image description here5. 在我的本地机器上通过 pip install redis 安装 redis。6. 打开终端输入 python 尝试连接托管在我的 Azure Ubuntu VM 上的 redis 服务器并成功获取 foo 键的值。

>>> import redis
>>> r = redis.Redis(host='xxx.xx.xx.xxx')
>>> r.get('foo')
b'bar'

我在测试中发现了两个关键问题。

  1. 对于redis.conf,绑定(bind)主机必须是0.0.0.0。如果不是,redis 服务器将以保护模式运行以拒绝查询。
  2. 对于 NSG 端口规则,请确保在附加到当前网络接口(interface)的 NSG 中添加的新端口规则,而不是默认子网。
  3. python 包 redis 是惰性评估,只有在第一个命令请求发生时才连接 redis 服务器。

希望对您有所帮助。

关于python - 无法从 Python 连接到在 Azure Linux VM 上运行的 Redis 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53383367/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com