Redis не удалось создатьUnix сокет.

Вопрос или проблема

Я пытаюсь настроить Redis на использование Unix сокета.

Я использую стандартную установку Debian /etc/redis/redis.conf, кроме следующих дополнений в конце файла, основываясь на этой информации:

# создайте сокет Unix для прослушивания
unixsocket /run/project/redis.sock 

# установите разрешения для сокета
unixsocketperm 775
 
#requirepass passwordtouse 
# bind 127.0.0.1 
 
daemonize yes 
 
# максимальная память, разрешенная для Redis
maxmemory 128Mb 

Я запрашиваю создание Unix сокета по пути /run/project/redis.socket:

# ll /run/project
total 4
drwxrwxrwx  2 michael  www-data 100 Aug 29 16:32 .
drwxr-xr-x 21 root     root     640 Aug 30 10:49 ..

Я добавил пользователя redis в группу www-data, а в desesperation добавил redis в группу michael.:

$ cat /etc/group | grep redis
www-data:x:33:michael,redis
michael:x:1000:www-data,redis
redis:x:119:

На мой взгляд, разрешения в порядке:

$ sudo -u redis touch /run/project/foo
$ ll /run/project/foo
-rw-r--r-- 1 redis redis 0 Aug 30 11:13 /run/project/foo

Однако, когда я перезагружаю сервер Redis, он не запускается:

$ systemctl restart redis-server.service
Работа для redis-server.service завершилась неудачно, так как управляющий процесс вышел с кодом ошибки.
Смотрите "systemctl status redis-server.service" и "journalctl -xe" для получения подробностей.
$ systemctl status redis-server.service
redis-server.service - Расширенное хранилище ключ-значение
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-08-30 10:49:52 SAST; 3min 47s ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
    Process: 2465457 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd --daemonize no (code=exited, status=1/FAILURE)
   Main PID: 2465457 (code=exited, status=1/FAILURE)
     Status: "Redis загружается..."
        CPU: 23ms

Aug 30 10:49:52 vps systemd[1]: redis-server.service: Главный процесс завершился, код=exited, status=1/FAILURE
Aug 30 10:49:52 vps systemd[1]: redis-server.service: Не удалось с результатом 'exit-code'.
Aug 30 10:49:52 vps systemd[1]: Не удалось запустить расширенное хранилище ключ-значение.
Aug 30 10:49:52 vps systemd[1]: redis-server.service: Запланирована перезагрузка, счетчик перезапуска равен 5.
Aug 30 10:49:52 vps systemd[1]: Остановлено расширенное хранилище ключ-значение.
Aug 30 10:49:52 vps systemd[1]: redis-server.service: Запрос на запуск повторился слишком быстро.
Aug 30 10:49:52 vps systemd[1]: redis-server.service: Не удалось с результатом 'exit-code'.
Aug 30 10:49:52 vps systemd[1]: Не удалось запустить расширенное хранилище ключ-значение.

Это файл журнала (по-видимому, предупреждение о TimeoutStartSec / TimeoutStopSec следует игнорировать, согласно моим исследованием).

2465442:C 30 Aug 2022 10:49:51.155 # ПРЕДУПРЕЖДЕНИЕ: под контролем systemd - вы ДОЛЖНЫ установить соответствующие значения для TimeoutStartSec и TimeoutStopSec в вашем сервисном модуле. 
2465442:C 30 Aug 2022 10:49:51.158 # oO0OoO0OoO0Oo Redis начинается oO0OoO0OoO0Oo 
2465442:C 30 Aug 2022 10:49:51.158 # Версия Redis=6.0.16, биты=64, commit=00000000, modified=0, pid=2465442, только запущен 
2465442:C 30 Aug 2022 10:49:51.158 # Конфигурация загружена 
2465442:M 30 Aug 2022 10:49:51.158 # Открытие Unix-сокета: bind: файловая система только для чтения 
$ journalctl -xeu redis.service
-- Журнал начинается с Пн 2021-08-16 08:09:33 SAST, заканчивается во Вт 2022-08-30 10:59:15 SAST. --
-- Нет записей --

Используя Debian. Установил redis с помощью sudo apt install redis.

Я попробовал это решение, но получил эту ошибку:

$ sudo systemctl enable redis.service
Не удалось включить единицу: Отказано в операции с именем псевдонима или связанной единицей: redis.service

ОБНОВЛЕНИЕ: Разрешения на файлы журнала/конфигурации:

$ ll /var/lib/redis/dump.rdb
-rw-rw---- 1 redis redis 93 Aug 29 14:53 /var/lib/redis/dump.rdb
$ ll /etc/redis/redis.conf 
-rw-r----- 1 redis redis 86461 Aug 30 11:11 /etc/redis/redis.conf
$ ll /var/log/redis/redis-server.log
-rw-rw---- 1 redis adm 22476 Aug 30 11:22 /var/log/redis/redis-server.log

Обновление о остановке, а затем перезапуске /usr/bin/redis-server:

$ systemctl stop redis-server.service
$ systemctl status redis-server.service
● redis-server.service - Расширенное хранилище ключ-значение
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-08-30 11:22:15 SAST; 1h 44min ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
    Process: 2682 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd --daemonize no (code=exited, status=1/FAILURE)
   Main PID: 2682 (code=exited, status=1/FAILURE)
     Status: "Redis загружается..."
        CPU: 24ms

Aug 30 11:22:15 vps systemd[1]: redis-server.service: Главный процесс завершился, код=exited, status=1/FAILURE
Aug 30 11:22:15 vps systemd[1]: redis-server.service: Не удалось с результатом 'exit-code'.
Aug 30 11:22:15 vps systemd[1]: Не удалось запустить расширенное хранилище ключ-значение.
Aug 30 11:22:15 vps systemd[1]: redis-server.service: Запланирована перезагрузка, счетчик перезапуска равен 5.
Aug 30 11:22:15 vps systemd[1]: Остановлено расширенное хранилище ключ-значение.
Aug 30 11:22:15 vps systemd[1]: redis-server.service: Запрос на запуск повторился слишком быстро.
Aug 30 11:22:15 vps systemd[1]: redis-server.service: Не удалось с результатом 'exit-code'.
Aug 30 11:22:15 vps systemd[1]: Не удалось запустить расширенное хранилище ключ-значение.
$ /usr/bin/redis-server /etc/redis/redis.conf
$

ОБНОВЛЕНИЕ:
Я пытался удалить и переустановить Redis, и это не помогло.
Установка в порядке, если я запускаю ее с конфигурацией по умолчанию, она работает:

# systemctl status redis-server.service
● redis-server.service - Расширенное хранилище ключ-значение
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-08-30 20:52:29 SAST; 44s ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
   Main PID: 26102 (redis-server)
     Status: "Готов к приему подключений"
      Tasks: 5 (limit: 1133)
     Memory: 7.4M
        CPU: 90ms
     CGroup: /system.slice/redis-server.service
             └─26102 /usr/bin/redis-server 127.0.0.1:6379

Aug 30 20:52:29 vps systemd[1]: Запуск расширенного хранилища ключ-значение...
Aug 30 20:52:29 vps systemd[1]: Запущено расширенное хранилище ключ-значение.

Однако, как только я добавляю следующее для использования unix сокета, он перестает работать:

unixsocket /run/project/redis.sock

# установите разрешения для сокета
unixsocketperm 775

requirepass passwordtouse
# bind 127.0.0.1

daemonize yes

# максимальная память, разрешенная для Redis
maxmemory 128Mb

Я полагаю, вы запутались с основными разрешениями файлов в Redis. Пожалуйста, проверьте ниже и убедитесь, что файлы/конфигурации доступны для Redis.

redis-server.log(и сопутствующие журналы файлов)
dump.rdb
Любой конфигурационный файл, который считывается процессом Redis

Обновление:
Если что-то еще мешает Redis запуститься, попробуйте следующую команду (измените путь в соответствии с вашей настройкой), это покажет вам точную проблему большинство времени.

/usr/bin/redis-server /etc/redis/redis.conf

unixsocketperm 777

Затем перезапустите Redis.

Много информации об этом, загуглите.

Это сработало для меня и для других.

Я думаю, я узнал об этом здесь… https://github.com/redis/node-redis/issues/204

Ответ или решение

Почему Redis не может создать Unix-сокет: анализ и решения

При настройке Redis на использование Unix-сокета важно учитывать множество факторов, включая правильные разрешения и конфигурацию системы. Ниже приведены основные шаги по диагностике и устранению причин, ведущих к сбою создания Unix-сокета.

1. Проверка конфигурации Redis

Для начала важно убедиться, что ваша конфигурация Redis корректна. В конфигурационном файле /etc/redis/redis.conf вы добавили следующие строки:

unixsocket /run/project/redis.sock 
unixsocketperm 775 
daemonize yes 
maxmemory 128Mb 

Эта конфигурация предполагает, что Redis будет слушать на сокете /run/project/redis.sock, а права доступа к этому сокету будут установлены на 775. Данная настройки позволяет пользователям из группы www-data и владельцу сокета пользователю redis подключаться к Redis.

2. Проверка разрешений на сокет

Убедитесь, что директория /run/project существует и имеет подходящие разрешения. В вашей ситуации вы можете видеть следующее:

drwxrwxrwx  2 michael  www-data 100 Aug 29 16:32 .

Обратите внимание, что разрешения – drwxrwxrwx, что означает, что любой пользователь может читать, записывать и исполнять файлы в этой директории. Это подходящие разрешения, однако убедитесь также, что процесс Redis запускается от имени пользователя redis, который имеет достаточные привилегии для создания файлов в данной директории.

Чтобы проверить, действительно ли процесс Redis принадлежит пользователю redis, выполните:

ps aux | grep redis

3. Ошибка "Read-only file system"

В логах Redis указано:

2465442:M 30 Aug 2022 10:49:51.158 # Opening Unix socket: bind: Read-only file system

Эта ошибка указывает на то, что файловая система, на которой вы пытаетесь создать сокет, доступна только для чтения. Это может произойти, если:

  • Вы используете временные файлы или точку монтирования, которая была неправильно смонтирована.
  • Операционная система определяет, что файловая система находится в режиме "только для чтения" из-за ошибок на диске.

Для решения этой проблемы проверьте статус вашей файловой системы с помощью команды:

mount | grep /run

Если /run или любая из родительских директорий имеют параметр ro, вам следует исправить это, например, размонтировав и перемонтировав файловую систему или исправив ошибки на диске.

4. Разрешения на файлы и директории

Каждый из файлов, с которыми работает Redis, должен иметь правильные разрешения. Проверьте следующие файлы и убедитесь, что они доступны для пользователя redis:

  • /var/lib/redis/dump.rdb
  • /etc/redis/redis.conf
  • /var/log/redis/redis-server.log

Разрешения на файл конфигурации могут быть повышены до 644, где владелец может читать и записывать файл, а остальные могут только читать:

sudo chmod 644 /etc/redis/redis.conf

5. Попробуйте запустить Redis вручную

Поскольку редактировать службу systemd может быть затруднительно, попробуйте запустить Redis напрямую с конфигурационным файлом:

/usr/bin/redis-server /etc/redis/redis.conf

Это поможет выявить любые ошибки конфигурации или недоступности ресурсов.

6. Обратитесь к логам

Если Redis все еще не запускается, проверьте логи:

sudo journalctl -u redis-server.service

Изучение логов может дать дополнительную информацию о том, почему процесс не может быть запущен.

Заключение

Ошибки в настройке Redis, такие как проблемы с правами доступа или ограничениями файловой системы, могут предотвратить создание Unix-сокета. Проведите пошаговую проверку конфигурации и убедитесь, что все настройки и разрешения установлены корректно. Удачи вам в устранении проблемы!

Оцените материал
Добавить комментарий

Капча загружается...