Невозможно подключиться к экземпляру Redis, работающему на виртуальной машине Azure Linux из Python - PullRequest
0 голосов
/ 20 ноября 2018

Я создал виртуальную машину Ubuntu в Azure.Во входящие сетевые фильтры я добавил порты 22 * ​​1002 * (для SSH ing) и 6379 (для Redis).После этого я SSH зашел в экземпляр из моей оболочки bash, скачал, собрал и установил Redis из исходного кода.Результирующий файл redis.conf находится в /tmp/redis-stable, поэтому я отредактировал его, чтобы закомментировать правило bind 127.0.0.1.

Затем я запустил redis-server redis.conf из каталога /tmp/redis-stable, и он запустился нормально, после чего я SSH врезался в другой экземпляр ВМ, запустил 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 в сообщении об ошибке то же самое, что я использую для SSH от bash и подключения к Redis из Python соответственно:

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

Я также попытался добавить bind 0.0.0.0 вфайл redis.conf после комментирования строки bind 127.0.0.1.Тот же результат.

Обновление: я попытался установить защищенный режим на 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, чтобы запустить его нормально.Но, конечно, я все еще не могу подключиться с удаленного Mac.

1 Ответ

0 голосов
/ 03 декабря 2018

Я попытался создать виртуальную машину Ubuntu в Azure, собрать и настроить сервер redis из исходного кода и добавить правило порта для своей виртуальной машины безопасности NSG на портале Azure, затем успешно подключил сервер redis через тот же код с пакетом redis для python .

Вот мои шаги, как показано ниже.

  1. Создание виртуальной машины Ubuntu 18.04 на портале Azure.
  2. Подключите виртуальную машину Ubuntu через SSH, чтобы установить пакеты сборки (включая build-essential, gcc и make), загрузить и распаковать файл tar.gz исходного кода redis из redis.io, а также собрать и протестировать сервер redis с make & make test.
  3. Настройте redis.conf через vim, чтобы изменить конфигурацию bind с 127.0.0.1 на 0.0.0.0.
  4. Добавьте новое правило порта 6379 порта с TCP в NSG для Network Interface, показанного на вкладке Settings -> Networking моей виртуальной машины на портале Azure, как показано на рисунках ниже.

enter image description here Примечания: На моей вкладке Networking есть два NSG, второй относится к моему Network Interface, к которому можно получить доступ через Интернет. enter image description here а также enter image description here 5. Установите redis через pip install redis на моем локальном компьютере. 6. Откройте терминал для ввода python, чтобы попытаться подключиться к серверу redis, расположенному на моей виртуальной машине Azure Ubuntu, и успешно получить значение ключа foo.

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

В ходе тестирования я обнаружил две ключевые проблемы.

  1. Для redis.conf хост привязки должен быть 0.0.0.0. Если нет, сервер redis будет работать в защищенном режиме, чтобы отклонить запрос.
  2. Для правил порта NSG убедитесь, что новое правило порта, добавленное в NSG, подключенном к текущему сетевому интерфейсу, а не к подсети по умолчанию.
  3. Пакет Python redis является отложенной оценкой, подключайте сервер redis только при первом запросе команды.

Надеюсь, это поможет.

...