Вопрос или проблема
Я пытаюсь настроить 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-сокета. Проведите пошаговую проверку конфигурации и убедитесь, что все настройки и разрешения установлены корректно. Удачи вам в устранении проблемы!