EQVPS
PanelZacznij

Jak zainstalować Redis na VPS: limit pamięci, trwałość danych i hasło, które nie znika

Instalujemy Redis na Ubuntu 24.04, ograniczamy jego pamięć, żeby nie zajął całego serwera, włączamy plik AOF bez kasowania danych i ustawiamy hasło, które przetrwa restart. W dwóch z tych kroków są pułapki, w które sami wpadliśmy na serwerze testowym.

Redis trzyma dane w pamięci i odpowiada w około milisekundę, dlatego stoi za tyloma aplikacjami jako cache, kolejka albo magazyn sesji. Instalacja to jedno polecenie. Praca zaczyna się przy ustawieniach domyślnych: brak limitu pamięci, migawki, które mogą zgubić ostatnie zapisy, i dwa łatwe błędy, które po cichu kasują dane albo wyłączają hasło. Ten poradnik omawia to wszystko na Ubuntu 24.04. Każdy krok przeszliśmy na naszym obrazie, a liczby pochodzą z serwera Micro (2 vCPU, 2 GB).

Potrzebujesz użytkownika z sudo. Tworzy go poradnik konfiguracji Ubuntu.

1. Instalacja

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

Instalacja trwała 13 sekund i dała Redis 7.0.15. Uruchamia się od razu i przy każdym starcie, odpowiada PONG i nasłuchuje tylko na samym serwerze: 127.0.0.1:6379 i [::1]:6379, z protected-mode yes. Bez danych zajmował 13,5 MB RAM.

W logu było już ostrzeżenie:

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

Redis zapisuje na dysk z kopii samego siebie utworzonej przez fork, a przy domyślnym ustawieniu jądra ten fork może się nie udać, gdy brakuje pamięci. Popraw to raz:

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

Po restarcie ostrzeżenie zniknęło.

2. Ogranicz pamięć

Fabrycznie maxmemory wynosi 0, czyli brak limitu, a polityka to noeviction. Redis będzie zajmował RAM, aż na serwerze go zabraknie. Ustaw sufit i zdecyduj, co się dzieje, gdy zostanie osiągnięty:

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

Sprawdziliśmy obie polityki z limitem 64 MB i 400 000 zapisów:

  • noeviction (domyślna): pamięć zatrzymała się na 63 MB, a nowe zapisy kończyły się błędem OOM command not allowed when used memory > 'maxmemory'. Dobra dla kolejki i wszystkiego, czego nie możesz stracić.
  • allkeys-lru: Redis usunął najdawniej używane klucze, 48 606 sztuk, a wszystkie zapisy przeszły. Dobra dla cache.

CONFIG REWRITE zapisuje bieżące ustawienia w /etc/redis/redis.conf, więc przetrwają restart. Dodaje też linię, o której trzeba wiedzieć przed krokiem 4.

3. Wybierz sposób zapisu na dysk

Domyślnie Redis zapisuje migawkę (/var/lib/redis/dump.rdb) po 1 zmianie w ciągu godziny, 100 w ciągu pięciu minut lub 10 000 w ciągu minuty. Sprawdziliśmy trzy sposoby jego zatrzymania:

Jak zatrzymał się RedisTylko migawki (domyślnie)Z plikiem AOF
systemctl restartNic nie zginęło: zapisuje przy zamykaniuNic nie zginęło
Zabity przez kill -9Klucz zapisany po ostatniej migawce zniknąłKlucz zapisany 2 sekundy przed kill był na miejscu

W obu przypadkach systemd sam podniósł Redisa w kilka sekund.

Jeśli w Redisie są dane, których byłoby szkoda, włącz plik AOF (append-only file). Zapisuje on każdą operację i zrzuca ją na dysk raz na sekundę. Rób to na działającym serwerze, a nie przez edycję pliku:

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

Najpierw spróbowaliśmy innej drogi i kosztowało nas to dane. Zmieniliśmy appendonly no na appendonly yes w redis.conf i zrestartowaliśmy. Redis wstał z pustym AOF i nic nie wczytał z migawki, więc wszystkie dotychczasowe klucze zniknęły. Przy następnym zamknięciu zapisał swoją nową zawartość, już bez starych kluczy, jeszcze na dump.rdb. CONFIG SET tego unika: Redis najpierw zapisuje AOF z danych w pamięci. Po restarcie wszystkie nasze klucze były na miejscu.

Jeśli Redis to czysty cache, który może startować pusty, zrób odwrotnie i wyłącz zapisywanie: redis-cli CONFIG SET save "".

4. Ustaw hasło

Oto druga pułapka. Po każdym CONFIG REWRITE Redis 7 dopisuje na końcu redis.conf taką linię:

user default on nopass ~* &* +@all

Oznacza ona „domyślny użytkownik nie potrzebuje hasła”. Potem dodaliśmy requirepass wyżej w pliku i zrestartowaliśmy. Redis dalej odpowiadał PONG bez hasła, bo linia user ma pierwszeństwo. Ustaw hasło przez sam 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

Zapisz hasło w bezpiecznym miejscu. Teraz Redis przechowuje je jako skrót SHA-256 w tej samej linii user default. Po restarcie redis-cli ping odpowiedział NOAUTH Authentication required. i działało tylko hasło. Przekazuj je do redis-cli przez zmienną REDISCLI_AUTH. Z opcją -a widać je na liście procesów i redis-cli przed tym ostrzega. W aplikacji wpisz je w adres Redisa: redis://:PASSWORD@127.0.0.1:6379/0.

5. Połączenie ze swojego komputera

Zostaw Redisa na 127.0.0.1 i korzystaj z tunelu SSH. Podaj port SSH swojego serwera; na planach z NAT to Twój osobisty port:

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

Dopóki tunel działa, redis-cli -p 6380 i programy na Twoim komputerze rozmawiają z Redisem na serwerze. Do internetu nic nowego nie zostaje otwarte. Z poradnikiem o kluczach SSH tunel loguje się bez hasła.

Jak jest szybki

Na serwerze testowym Micro redis-benchmark z 50 klientami pokazał:

TestŻądań na sekundęMediana opóźnienia
SET30 3031,0 ms
GET35 1490,9 ms
SET, 16 poleceń na jedną wymianę272 1092,4 ms
GET, 16 poleceń na jedną wymianę414 9381,3 ms

Na cache albo kolejkę zadań aplikacji webowej to dużo więcej, niż będzie potrzebne. Dodatkowa szybkość bierze się z wysyłania poleceń paczkami (pipelining).

Jaki plan

Redis potrzebuje RAM na Twoje dane i niewiele więcej. Nano (2 vCPU, 1 GB, $3/mies.) uciągnie Redisa obok małej aplikacji przy maxmemory 256mb. Micro (2 GB, $5/mies.) zostawia miejsce na większy cache i samą aplikację. Jeśli coś innego ma łączyć się z Redisem bezpośrednio, weź własny IPv4 (od Nano-IP za $8/mies.) i w zaporze wpuść tylko ten jeden adres. Wszystkie plany są na stronie VPS, a płatność odbywa się w USDT, USDC lub ETH w sieciach Base, Ethereum lub Polygon.

FAQ

Ile RAM potrzebuje Redis?

Sam Redis jest malutki: 13,5 MB tuż po instalacji na naszym serwerze. Potrzebuje miejsca na Twoje dane, bo trzyma je w pamięci. Ustaw maxmemory na tyle, ile serwer może oddać, na przykład 256 MB na serwerze z 1 GB, i zdecyduj, co ma się dziać, gdy pamięć się zapełni.

Redis czy Valkey?

Valkey to fork Redisa, który wyszedł z Redis 7.2 i mówi tym samym protokołem, więc większość klientów działa z oboma. Ubuntu 24.04 ma tylko Redis 7.0.15. Debian 13 ma Redis 8.0 i Valkey 8.1, a Debian 12 dostaje Valkey 8.0 z backports. Kroki z tego poradnika pasują do obu.

Dlaczego Redis traci dane po awarii?

Domyślnie Redis zapisuje migawkę na dysk co kilka minut, zależnie od liczby zmienionych kluczy. Gdy zabiliśmy proces, klucz zapisany po ostatniej migawce zniknął. Włącz plik AOF, który zapisuje co sekundę, a awaria będzie Cię kosztować najwyżej około sekundy zapisów.

Dodałem requirepass do redis.conf, dlaczego Redis dalej przyjmuje polecenia bez hasła?

Najpewniej kiedyś uruchomiono CONFIG REWRITE. W Redis 7 dopisuje ono na końcu redis.conf linię user default on nopass ~* &* +@all, a ta linia unieważnia requirepass wpisany wyżej. Ustaw hasło przez CONFIG SET requirepass, a potem CONFIG REWRITE, i Redis zapisze je w tej linii.

Czy mogę otworzyć port 6379 na internet?

Lepiej nie. Otwarte porty Redisa są skanowane bez przerwy i są częstą drogą do włamania na serwer. Łącz się z Redisem ze swojego komputera przez tunel SSH albo trzymaj go na tym samym serwerze co aplikacja, która z niego korzysta.

Komentarze

Brak komentarzy. Bądź pierwszy.

Zostaw komentarz

Komentarze są moderowane przed pojawieniem się.