EQVPS
КабинетНачать

Как установить Redis на VPS: лимит памяти, сохранение на диск и пароль, который не слетает

Устанавливаем Redis на Ubuntu 24.04, ограничиваем его память, чтобы он не занял весь сервер, включаем журнал AOF без потери данных и ставим пароль, который переживает перезапуск. На двух из этих шагов есть ловушки, в которые мы сами попали на тестовом сервере.

Redis хранит данные в памяти и отвечает примерно за миллисекунду, поэтому он стоит за множеством приложений в роли кэша, очереди или хранилища сессий. Установка — одна команда. Работа начинается с настроек по умолчанию: лимита памяти нет, снимки могут потерять последние записи, и есть две лёгкие ошибки, которые незаметно стирают данные или отключают пароль. Эта инструкция разбирает всё это на Ubuntu 24.04. Каждый шаг мы прошли на нашем образе, цифры сняты на сервере Micro (2 vCPU, 2 ГБ).

Нужен пользователь с sudo. Его создаёт инструкция по настройке Ubuntu.

1. Установка

sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping

Установка заняла 13 секунд и поставила Redis 7.0.15. Он сразу запускается, стартует при каждой загрузке, отвечает PONG и слушает только сам сервер: 127.0.0.1:6379 и [::1]:6379, с protected-mode yes. Без данных он занял 13,5 МБ памяти.

В журнале уже было предупреждение:

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.

Redis сохраняет данные на диск из своей копии, созданной через fork, и при стандартной настройке ядра этот fork может не сработать, когда памяти мало. Исправьте один раз:

echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server

После перезапуска предупреждение исчезло.

2. Ограничьте память

Из коробки maxmemory равен 0, то есть лимита нет, а политика — noeviction. Redis будет занимать память, пока она на сервере не кончится. Задайте потолок и решите, что происходит при его достижении:

redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE

Мы проверили обе политики с лимитом 64 МБ и 400 000 записей:

  • noeviction (по умолчанию): память остановилась на 63 МБ, а новые записи падали с ошибкой OOM command not allowed when used memory > 'maxmemory'. Подходит для очереди и всего, что нельзя терять.
  • allkeys-lru: Redis выбросил давно не используемые ключи, 48 606 штук, и все записи прошли. Подходит для кэша.

CONFIG REWRITE сохраняет текущие настройки в /etc/redis/redis.conf, и они переживают перезапуск. Ещё она добавляет строку, о которой нужно знать до шага 4.

3. Выберите, как сохранять на диск

По умолчанию Redis пишет снимок (/var/lib/redis/dump.rdb) после 1 изменения за час, 100 за пять минут или 10 000 за минуту. Мы проверили три способа его остановить:

Как остановился RedisТолько снимки (по умолчанию)С журналом AOF
systemctl restartНичего не потеряно: при остановке он сохраняетсяНичего не потеряно
Убит через kill -9Ключ, записанный после последнего снимка, пропалКлюч, записанный за 2 секунды до kill, на месте

В обоих случаях systemd сам поднял Redis за несколько секунд.

Если в Redis лежат данные, которых будет жалко, включите журнал AOF (append-only file). Он записывает каждую операцию и сбрасывает её на диск раз в секунду. Делайте это на работающем сервере, а не правкой файла:

redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_

Сначала мы попробовали другой путь, и он стоил нам данных. Мы поменяли appendonly no на appendonly yes в redis.conf и перезапустили. Redis поднялся с пустым AOF и ничего не загрузил из снимка, так что все прежние ключи пропали. А при следующей остановке он записал своё новое содержимое, уже без старых ключей, ещё и поверх dump.rdb. CONFIG SET этого избегает: Redis сначала пишет AOF из данных в памяти. После перезапуска все наши ключи были на месте.

Если Redis — чистый кэш, которому не страшно стартовать пустым, сделайте наоборот и отключите сохранение: redis-cli CONFIG SET save "".

4. Поставьте пароль

Вот вторая ловушка. После любого CONFIG REWRITE Redis 7 добавляет в конец redis.conf такую строку:

user default on nopass ~* &* +@all

Она значит «пользователю по умолчанию пароль не нужен». Потом мы добавили requirepass выше в файле и перезапустили. Redis по-прежнему отвечал PONG без пароля, потому что строка user его перекрывает. Задавайте пароль через сам Redis:

REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE

Сохраните пароль в надёжном месте. Теперь Redis хранит его хешем SHA-256 в той же строке user default. После перезапуска redis-cli ping ответил NOAUTH Authentication required., и работал только пароль. Передавайте его в redis-cli через переменную REDISCLI_AUTH. С ключом -a он виден в списке процессов, и redis-cli об этом предупреждает. В приложении укажите его в адресе Redis: redis://:PASSWORD@127.0.0.1:6379/0.

5. Подключение со своего компьютера

Оставьте Redis на 127.0.0.1 и пользуйтесь SSH-туннелем. Укажите SSH-порт вашего сервера; на тарифах с NAT это ваш персональный порт:

ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22

Пока туннель открыт, redis-cli -p 6380 и программы на вашем компьютере работают с Redis на сервере. В интернет при этом ничего нового не открыто. С инструкцией по SSH-ключам туннель будет входить без пароля.

Насколько он быстрый

На тестовом сервере Micro redis-benchmark с 50 клиентами показал:

ТестЗапросов в секундуМедианная задержка
SET30 3031,0 мс
GET35 1490,9 мс
SET, 16 команд за один обмен272 1092,4 мс
GET, 16 команд за один обмен414 9381,3 мс

Для кэша или очереди задач веб-приложения это намного больше, чем понадобится. Дополнительная скорость берётся из отправки команд пачками (pipelining).

Какой тариф выбрать

Redis нужна память под ваши данные и почти ничего больше. Nano (2 vCPU, 1 ГБ, $3/мес) держит Redis рядом с небольшим приложением при maxmemory 256mb. Micro (2 ГБ, $5/мес) оставляет место под кэш побольше и само приложение. Если к Redis должен напрямую подключаться кто-то ещё, возьмите собственный IPv4 (с Nano-IP за $8/мес) и разрешите в файрволе только этот адрес. Все тарифы — на странице VPS, оплата в USDT, USDC или ETH в сетях Base, Ethereum или Polygon.

Частые вопросы

Сколько оперативной памяти нужно Redis?

Сам Redis крошечный: 13,5 МБ сразу после установки на нашем сервере. Память ему нужна под ваши данные, потому что они хранятся в RAM. Задайте maxmemory по силам сервера, например 256 МБ на сервере с 1 ГБ, и решите, что делать, когда память закончится.

Redis или Valkey?

Valkey — форк Redis, начатый с версии 7.2, протокол у них один, поэтому большинство клиентов работают с обоими. В Ubuntu 24.04 есть только Redis 7.0.15. В Debian 13 есть и Redis 8.0, и Valkey 8.1, а в Debian 12 Valkey 8.0 приходит из backports. Шаги этой инструкции подходят для обоих.

Почему Redis теряет данные после сбоя?

По умолчанию Redis сохраняет снимок на диск раз в несколько минут, в зависимости от числа изменённых ключей. Когда мы убили процесс, ключ, записанный после последнего снимка, пропал. Включите журнал AOF, который пишет на диск каждую секунду, и сбой будет стоить вам не больше секунды записей.

Я добавил requirepass в redis.conf, почему Redis всё ещё принимает команды без пароля?

Скорее всего, когда-то выполнялась команда CONFIG REWRITE. В Redis 7 она дописывает в конец redis.conf строку user default on nopass ~* &* +@all, и эта строка отменяет requirepass, добавленный выше. Задайте пароль через CONFIG SET requirepass, затем выполните CONFIG REWRITE, и Redis сохранит его в этой строке.

Можно открыть порт 6379 в интернет?

Не надо. Открытые порты Redis постоянно сканируют, и это частый путь взлома серверов. Подключайтесь к Redis со своего компьютера через SSH-туннель или держите его на одном сервере с приложением, которое им пользуется.

Комментарии

Пока нет комментариев. Будьте первым.

Оставить комментарий

Комментарии проходят модерацию перед публикацией.