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
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
Узнайте мажорную версию системы — она понадобится для адреса репозитория:
rpm -E %rhelСоздайте файл репозитория /etc/yum.repos.d/redis.repo. Для AlmaLinux/Rocky Linux 9:
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-ключ и поставьте пакет:
curl -fsSL https://packages.redis.io/gpg > /tmp/redis.key
sudo rpm --import /tmp/redis.key
sudo dnf install -y redisПроверьте, что пакет установился:
redis-server -vШаг 2. Включите автозапуск и запустите Redis через systemd
Имя systemd-сервиса отличается по семействам дистрибутивов: redis-server на Ubuntu/Debian, redis на AlmaLinux/Rocky Linux. Запомните своё — оно понадобится и дальше по статье.
Ubuntu / Debian
sudo systemctl enable --now redis-server
sudo systemctl status redis-serverНа Ubuntu/Debian пакет обычно уже запускает Redis и добавляет его в автозагрузку сам — команда выше в этом случае просто подтвердит, что всё в порядке.
AlmaLinux / Rocky Linux
sudo systemctl enable --now redis
sudo systemctl status redisНа AlmaLinux/Rocky Linux, в отличие от Ubuntu/Debian, Redis не запускается и не добавляется в автозагрузку автоматически — этот шаг обязателен.
В обоих случаях в статусе должно быть active (running). Проверьте, что сервер отвечает на loopback-интерфейсе:
redis-cli pingPONGШаг 3. Настройте безопасность: bind, protected-mode и пароль (requirepass)
Конфигурация лежит в одном и том же месте на всех трёх семействах дистрибутивов — /etc/redis/redis.conf. Посмотрите текущие значения bind и protected-mode:
grep -E "^(bind|protected-mode)" /etc/redis/redis.confbind 127.0.0.1 -::1
protected-mode yesbind 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:
bind 127.0.0.1 -::1 YOUR_OTHER_SERVER_IPТеперь задайте пароль. Сгенерируйте длинную случайную строку:
openssl rand -base64 32Команда выведет случайную строку — скопируйте её и сохраните в менеджере паролей, дальше она понадобится ещё не раз.
Откройте конфигурацию:
sudo nano /etc/redis/redis.confЗаодно убедитесь, что строка protected-mode yes из проверки выше не закомментирована — если её нет вообще или она закомментирована, допишите/раскомментируйте именно в таком виде. Затем найдите в секции SECURITY закомментированную строку # requirepass foobared (или просто найдите requirepass поиском — в nano это Ctrl+W) и приведите её к виду:
requirepass YOUR_STRONG_PASSWORDЗамените YOUR_STRONG_PASSWORD на пароль, который вывела команда openssl rand выше. Сохраните файл и перезапустите сервис — своей командой из шага 2:
sudo systemctl restart redis-server # Ubuntu / Debiansudo systemctl restart redis # AlmaLinux / Rocky LinuxПроверьте, что пароль действительно требуется:
redis-cli ping(error) NOAUTH Authentication required.Если Redis должен быть доступен с другого VPS, откройте порт только для его IP-адреса:
sudo ufw allow from YOUR_TRUSTED_IP to any port 6379 proto tcpНа AlmaLinux/Rocky Linux (firewalld) — тот же смысл через rich rule:
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:
export REDISCLI_AUTH='YOUR_STRONG_PASSWORD'
redis-cli pingPONGДля разового ручного теста подойдёт и -a:
redis-cli -a 'YOUR_STRONG_PASSWORD' pingWarning: 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):
redis-cli -u 'redis://default:YOUR_STRONG_PASSWORD@127.0.0.1:6379/0' pingЕсли REDISCLI_AUTH уже задан в текущей сессии, можно заходить в интерактивный режим без -a вообще — либо авторизоваться прямо внутри него командой AUTH:
127.0.0.1:6379> AUTH YOUR_STRONG_PASSWORD
OK
127.0.0.1:6379> PING
PONGПроверьте базовые команды — запись, чтение, TTL, удаление:
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Шаг 5. Типовое использование: кэш и хранилище сессий
Как кэш
Для кэша обычно ограничивают память под Redis и включают автоматическое вытеснение старых ключей — тогда приложению не нужно самому следить за объёмом данных. Посмотрите, сколько RAM свободно на VPS:
free -hДобавьте в /etc/redis/redis.conf (секция MEMORY MANAGEMENT) лимит и политику вытеснения, оставив запас под остальные процессы на сервере:
maxmemory 256mb
maxmemory-policy allkeys-lruallkeys-lru — Redis сам вытесняет наименее недавно использованные ключи при достижении лимита, независимо от того, задан ли у них TTL. Это поведение, близкое к memcached, и его достаточно для большинства кэшей.
Примените без перезапуска и сохраните изменения в файл:
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 REWRITECONFIG REWRITE переносит текущие значения обратно в redis.conf, чтобы они сохранились и после перезапуска (правку в файле из шага выше можно было бы не делать — либо файлом, либо CONFIG SET + CONFIG REWRITE, оба пути приводят к одному результату).
Само кэширование в приложении — это просто SET с истечением срока:
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 обслуживает и кэш, и сессии, разделите их по номеру базы данных (SELECT, всего доступно 16 баз, 0–15 по умолчанию), чтобы ключи не путались между собой:
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 — все три пункта сразу, а не один из них.