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-тунель або тримайте його на одному сервері із застосунком, який ним користується.

Коментарі

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

Залишити коментар

Коментарі проходять модерацію перед публікацією.