MHOSTMHOST

Redis: установка и настройка

Redis — быстрое in-memory хранилище «ключ-значение», которое обычно ставят рядом с основным приложением как кэш и/или хранилище сессий. В этой статье вы установите Redis на VPS mHost, включите автозапуск, настроите пароль и сетевой доступ (requirepass, bind, protected-mode), проверите сервер через redis-cli и разберёте типовые сценарии — кэш и сессии.

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH под root или пользователем с правами sudo.
  • Приложение, которому нужен кэш или сессии (свой код, FastAPI, Django, Node.js и т.п.) — Redis в этой статье рассматривается сам по себе, без привязки к конкретному фреймворку. Если приложение ещё не развёрнуто на этом VPS, посмотрите статьи «Python и FastAPI: продакшн-деплой» или «Django на VPS».

Шаг 1. Установите Redis

Ставим Redis из официального репозитория packages.redis.io, а не из штатного репозитория дистрибутива. Причина: версия Redis в стандартных репозиториях Ubuntu/Debian часто заметно старее актуальной, а на AlmaLinux/Rocky Linux 9 команда dnf install redis из AppStream может вместо настоящего Redis поставить его форк Valkey под похожим именем пакета. Официальный репозиторий даёт одинаковую, предсказуемую и актуальную версию Redis на всех трёх семействах дистрибутивов.

Ubuntu / Debian

bash
sudo apt-get install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install -y redis

Пакет redis — метапакет, который подтянет redis-server (сам сервер) и redis-tools (включая redis-cli).

AlmaLinux / Rocky Linux

Узнайте мажорную версию системы — она понадобится для адреса репозитория:

bash
rpm -E %rhel

Создайте файл репозитория /etc/yum.repos.d/redis.repo. Для AlmaLinux/Rocky Linux 9:

bash
sudo tee /etc/yum.repos.d/redis.repo <<'EOF'
[Redis]
name=Redis
baseurl=http://packages.redis.io/rpm/rockylinux9
enabled=1
gpgcheck=1
EOF

Для AlmaLinux/Rocky Linux 8 — то же самое, но с baseurl=http://packages.redis.io/rpm/rockylinux8.

Импортируйте GPG-ключ и поставьте пакет:

bash
curl -fsSL https://packages.redis.io/gpg > /tmp/redis.key
sudo rpm --import /tmp/redis.key
sudo dnf install -y redis
Совет: если при установке dnf всё же попросит подтвердить GPG-ключ репозитория — сверьте показанный отпечаток с указанным на packages.redis.io и только потом подтверждайте (y).

Проверьте, что пакет установился:

bash
redis-server -v

Шаг 2. Включите автозапуск и запустите Redis через systemd

Имя systemd-сервиса отличается по семействам дистрибутивов: redis-server на Ubuntu/Debian, redis на AlmaLinux/Rocky Linux. Запомните своё — оно понадобится и дальше по статье.

Ubuntu / Debian

bash
sudo systemctl enable --now redis-server
sudo systemctl status redis-server

На Ubuntu/Debian пакет обычно уже запускает Redis и добавляет его в автозагрузку сам — команда выше в этом случае просто подтвердит, что всё в порядке.

AlmaLinux / Rocky Linux

bash
sudo systemctl enable --now redis
sudo systemctl status redis

На AlmaLinux/Rocky Linux, в отличие от Ubuntu/Debian, Redis не запускается и не добавляется в автозагрузку автоматически — этот шаг обязателен.

В обоих случаях в статусе должно быть active (running). Проверьте, что сервер отвечает на loopback-интерфейсе:

bash
redis-cli ping
bash
PONG
Готово: Redis установлен, работает и запустится автоматически после перезагрузки VPS.

Шаг 3. Настройте безопасность: bind, protected-mode и пароль (requirepass)

Важно: никогда не открывайте порт Redis (6379) в интернет без пароля. Redis проектировался для работы в доверенной сети и не имеет встроенной защиты от подбора или DDoS: незащищённые инстансы находят автоматическим сканированием за считаные минуты, а один-единственный FLUSHALL от анонимного клиента безвозвратно удаляет все данные. Если Redis нужен только вашему приложению на этом же VPS — не трогайте bind вообще и оставьте всё как есть. Если Redis должен быть доступен с другого сервера — обязательны все три пункта этого шага плюс файрвол, который пропускает порт 6379 только с конкретного доверенного IP (см. статью «Файрвол ufw: порты»).

Конфигурация лежит в одном и том же месте на всех трёх семействах дистрибутивов — /etc/redis/redis.conf. Посмотрите текущие значения bind и protected-mode:

bash
grep -E "^(bind|protected-mode)" /etc/redis/redis.conf
bash
bind 127.0.0.1 -::1
protected-mode yes
  • bind 127.0.0.1 -::1 — Redis слушает только loopback: 127.0.0.1 (IPv4) и ::1 (IPv6). Дефис перед ::1 означает «не считать ошибкой запуска, если IPv6 недоступен» — просто пропустить этот адрес. Для типового сценария (приложение и Redis на одном VPS) это уже безопасное и рабочее значение, менять не нужно.
  • protected-mode yes — дополнительный защитный слой: если Redis всё же будет слушать все интерфейсы (bind пуст или включает 0.0.0.0) и пароль не задан, protected mode отклонит любые подключения, кроме как с loopback. Держите его включённым всегда, даже если bind уже ограничен.

Если приложению на другом VPS нужен доступ к этому Redis, добавьте к bind конкретный IP (не 0.0.0.0) — публичный IP этого сервера (вариант по умолчанию) либо приватный адрес, если у вас отдельно подключена платная услуга приватной сети между VPS mHost:

bash
bind 127.0.0.1 -::1 YOUR_OTHER_SERVER_IP
Важно: по умолчанию приватной сети между VPS mHost нет — она доступна только как платная дополнительная услуга. Без неё используется публичный IP сервера, и тогда ограничивать доступ файрволом до одного конкретного адреса (шаг ниже) обязательно — без этого расширение bind за пределы loopback вместе с публичным IP означает, что порт 6379 в принципе достижим из интернета.

Теперь задайте пароль. Сгенерируйте длинную случайную строку:

bash
openssl rand -base64 32

Команда выведет случайную строку — скопируйте её и сохраните в менеджере паролей, дальше она понадобится ещё не раз.

Откройте конфигурацию:

bash
sudo nano /etc/redis/redis.conf

Заодно убедитесь, что строка protected-mode yes из проверки выше не закомментирована — если её нет вообще или она закомментирована, допишите/раскомментируйте именно в таком виде. Затем найдите в секции SECURITY закомментированную строку # requirepass foobared (или просто найдите requirepass поиском — в nano это Ctrl+W) и приведите её к виду:

bash
requirepass YOUR_STRONG_PASSWORD

Замените YOUR_STRONG_PASSWORD на пароль, который вывела команда openssl rand выше. Сохраните файл и перезапустите сервис — своей командой из шага 2:

bash
sudo systemctl restart redis-server    # Ubuntu / Debian
bash
sudo systemctl restart redis           # AlmaLinux / Rocky Linux

Проверьте, что пароль действительно требуется:

bash
redis-cli ping
bash
(error) NOAUTH Authentication required.
Готово: если вместо PONG вы видите NOAUTH Authentication required. — пароль работает, неавторизованные запросы отклоняются.
Совет: requirepass — простой и «legacy»-способ аутентификации, задаёт один общий пароль для всех клиентов. Начиная с Redis 6 есть более гибкий вариант — ACL с именованными пользователями и правами на конкретные команды и ключи. Для одного VPS с одним приложением requirepass обычно достаточно; ACL стоит смотреть отдельно, если к одному Redis обращается несколько независимых сервисов с разными правами.

Если Redis должен быть доступен с другого VPS, откройте порт только для его IP-адреса:

bash
sudo ufw allow from YOUR_TRUSTED_IP to any port 6379 proto tcp

На AlmaLinux/Rocky Linux (firewalld) — тот же смысл через rich rule:

bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="YOUR_TRUSTED_IP" port port="6379" protocol="tcp" accept'
sudo firewall-cmd --reload

Подробный разбор команд ufw и логики файрвола — в статье «Файрвол ufw: порты». Не используйте ufw allow 6379/tcp или firewall-cmd --add-port=6379/tcp без указания источника — это откроет порт для всех, а не только для доверенного сервера.

Шаг 4. Протестируйте Redis через redis-cli

Передавать пароль через -a прямо в команде удобно для разовой проверки, но небезопасно для скриптов — он остаётся в истории шелла и виден в выводе ps aux. Для регулярного использования передавайте его через переменную окружения REDISCLI_AUTH:

bash
export REDISCLI_AUTH='YOUR_STRONG_PASSWORD'
redis-cli ping
bash
PONG

Для разового ручного теста подойдёт и -a:

bash
redis-cli -a 'YOUR_STRONG_PASSWORD' ping
bash
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG

Предупреждение ожидаемо и не мешает работе — это просто напоминание не использовать -a в скриптах. Если знаете, что делаете, и хотите убрать предупреждение из вывода (например, в cron-задаче), добавьте флаг --no-auth-warning.

Redis также понимает подключение по URI — с логином default (имя пользователя по умолчанию для парольной аутентификации без ACL):

bash
redis-cli -u 'redis://default:YOUR_STRONG_PASSWORD@127.0.0.1:6379/0' ping

Если REDISCLI_AUTH уже задан в текущей сессии, можно заходить в интерактивный режим без -a вообще — либо авторизоваться прямо внутри него командой AUTH:

bash
127.0.0.1:6379> AUTH YOUR_STRONG_PASSWORD
OK
127.0.0.1:6379> PING
PONG

Проверьте базовые команды — запись, чтение, TTL, удаление:

bash
127.0.0.1:6379> SET greeting "hello from mhost"
OK
127.0.0.1:6379> GET greeting
"hello from mhost"
127.0.0.1:6379> EXPIRE greeting 60
(integer) 1
127.0.0.1:6379> TTL greeting
(integer) 60
127.0.0.1:6379> DEL greeting
(integer) 1
Важно: команда CONFIG GET requirepass возвращает пароль открытым текстом любому уже авторизованному клиенту. Это ожидаемое поведение Redis, а не баг, но лишний повод не давать доступ к Redis никому, кроме своего приложения.

Шаг 5. Типовое использование: кэш и хранилище сессий

Как кэш

Для кэша обычно ограничивают память под Redis и включают автоматическое вытеснение старых ключей — тогда приложению не нужно самому следить за объёмом данных. Посмотрите, сколько RAM свободно на VPS:

bash
free -h

Добавьте в /etc/redis/redis.conf (секция MEMORY MANAGEMENT) лимит и политику вытеснения, оставив запас под остальные процессы на сервере:

bash
maxmemory 256mb
maxmemory-policy allkeys-lru

allkeys-lru — Redis сам вытесняет наименее недавно использованные ключи при достижении лимита, независимо от того, задан ли у них TTL. Это поведение, близкое к memcached, и его достаточно для большинства кэшей.

Примените без перезапуска и сохраните изменения в файл:

bash
redis-cli -a 'YOUR_STRONG_PASSWORD' CONFIG SET maxmemory 256mb
redis-cli -a 'YOUR_STRONG_PASSWORD' CONFIG SET maxmemory-policy allkeys-lru
redis-cli -a 'YOUR_STRONG_PASSWORD' CONFIG REWRITE

CONFIG REWRITE переносит текущие значения обратно в redis.conf, чтобы они сохранились и после перезапуска (правку в файле из шага выше можно было бы не делать — либо файлом, либо CONFIG SET + CONFIG REWRITE, оба пути приводят к одному результату).

Само кэширование в приложении — это просто SET с истечением срока:

bash
127.0.0.1:6379> SET cache:user:42 "{\"name\":\"demo\"}" EX 300
OK

Ключ cache:user:42 исчезнет сам через 300 секунд — приложение при промахе кэша просто пересчитывает значение и кладёт его обратно.

Как хранилище сессий

Большинство фреймворков подключают Redis для сессий по строке подключения вида redis://default:YOUR_STRONG_PASSWORD@127.0.0.1:6379/0 или по отдельным настройкам хоста/порта/пароля — в Python (например, через django-redis в Django), в Node.js (connect-redis поверх express-session), в PHP (многие фреймворки, включая Laravel, поддерживают SESSION_DRIVER=redis из коробки). Точные названия переменных окружения зависят от фреймворка.

Проверьте: актуальный формат настроек Redis для сессий в документации своего фреймворка — эти детали меняются от версии к версии.

Если один и тот же Redis обслуживает и кэш, и сессии, разделите их по номеру базы данных (SELECT, всего доступно 16 баз, 0–15 по умолчанию), чтобы ключи не путались между собой:

bash
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SET session:abc123 "..."
OK

По умолчанию Redis периодически сохраняет снимок данных на диск (RDB, директива save в redis.conf) — сессии переживут перезапуск сервиса. Если Redis используется только как одноразовый кэш и данные не жалко потерять при перезапуске, персистентность можно отключить ради производительности, задав save "" в redis.conf — но это отдельная тема, выходящая за рамки этой статьи.

Что дальше

Redis установлен, защищён паролем и работает как systemd-сервис. Если ещё не проходили общий чеклист безопасности VPS — посмотрите статью «Чеклист базовой защиты VPS». И ещё раз: если Redis когда-нибудь понадобится сделать доступным не только с loopback, обязательно пройдите шаг 3 полностью — requirepass, ограниченный bind и файрвол по конкретному IP — все три пункта сразу, а не один из них.