EQVPS
ТаблоЗапочни

Как да инсталирате Redis на VPS: лимит на паметта, запис на диск и парола, която не изчезва

Инсталирайте Redis на Ubuntu 24.04, ограничете паметта му, за да не заеме целия сървър, включете файла AOF, без да изтриете данните си, и задайте парола, която оцелява при рестарт. В две от стъпките има капани, в които сами попаднахме на тестовия си сървър.

Redis държи данните в паметта и отговаря за около милисекунда, затова стои зад толкова много приложения като кеш, опашка или хранилище за сесии. Инсталирането е една команда. Работата е в настройките по подразбиране: няма лимит на паметта, моментните снимки могат да изгубят последните записи, а две лесни грешки тихо изтриват данните ви или изключват паролата ви. Това ръководство разглежда всичко на Ubuntu 24.04. Минахме всяка стъпка на нашия образ; числата са от сървър Micro (2 vCPU, 2 GB).

Нужен ви е потребител със 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 MB RAM.

В лога вече имаше предупреждение:

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 ще заема RAM, докато на сървъра не свърши. Задайте таван и решете какво става, когато бъде достигнат:

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

Изпробвахме двете политики с лимит 64 MB и 400 000 записа:

  • noeviction (по подразбиране): паметта спря на 63 MB, а новите записи се проваляха с 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 секунди преди това, беше на мястото си

И в двата случая 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 ms
GET35 1490,9 ms
SET, 16 команди за едно отиване и връщане272 1092,4 ms
GET, 16 команди за едно отиване и връщане414 9381,3 ms

За кеша или опашката със задачи на уеб приложение това е много повече, отколкото ще ви трябва. Допълнителната скорост идва от изпращането на команди на пакети (pipelining).

Кой план

На Redis му трябва RAM за данните ви и малко друго. Nano (2 vCPU, 1 GB, $3/месец) движи Redis до малко приложение с maxmemory 256mb. Micro (2 GB, $5/месец) оставя място за по-голям кеш и самото приложение. Ако нещо друго трябва да се свързва директно с Redis, вземете собствен IPv4 (от Nano-IP за $8/месец) и разрешете във защитната стена само този адрес. Всички планове са на страницата VPS, а плащането е в USDT, USDC или ETH в мрежите Base, Ethereum или Polygon.

Въпроси

Колко RAM е нужна на Redis?

Самият Redis е мъничък: 13,5 MB веднага след инсталирането на нашия сървър. Нужно му е място за вашите данни, защото те стоят в паметта. Задайте maxmemory според възможностите на сървъра, например 256 MB при сървър с 1 GB, и изберете какво става, когато паметта се напълни.

Redis или Valkey?

Valkey е форк на Redis, започнал от 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 тунел или го дръжте на един сървър с приложението, което го ползва.

Коментари

Още няма коментари. Бъди първият.

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

Коментарите се модерират преди да се появят.