EQVPS
ダッシュボード始める

VPS に Redis をインストールする方法:メモリ上限、永続化、消えないパスワード

Ubuntu 24.04 に Redis を入れ、サーバー全体を食いつぶさないようメモリを制限し、データを消さずに AOF を有効にし、再起動しても残るパスワードを設定します。このうち 2 つの手順には、私たち自身がテストサーバーで引っかかった落とし穴があります。

Redis はデータをメモリに置き、1 ミリ秒ほどで応答します。そのため、キャッシュ、キュー、セッションストアとして多くのアプリの裏側で使われています。インストールはコマンド 1 つです。手間がかかるのは既定の設定のほうで、メモリ上限がなく、スナップショットは直近の書き込みを失うことがあり、さらにデータを黙って消したりパスワードを無効にしたりする、ありがちなミスが 2 つあります。このガイドでは 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 でした。

ログにはすでに警告が出ていました。

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 MB、40 万回の書き込みで両方のポリシーを試しました。

  • 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 は 1 時間に 1 回、5 分に 100 回、1 分に 1 万回の変更のいずれかでスナップショット(/var/lib/redis/dump.rdb)を書きます。止め方を 3 通り試しました。

Redis の止まり方スナップショットのみ(既定)AOF あり
systemctl restart損失なし:停止時に保存する損失なし
kill -9 で強制終了最後のスナップショット以降のキーが消えた強制終了の 2 秒前に書いたキーが残っていた

どちらの場合も、systemd が数秒で Redis を自動的に起動し直しました。

失って困るデータが Redis にあるなら、AOF(append-only file)を有効にしてください。すべての書き込みを記録し、1 秒に 1 回ディスクに書き出します。ファイルを編集するのではなく、稼働中のサーバーで設定してください。

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

最初は別のやり方を試し、データを失いました。redis.conf の appendonly no を appendonly yes に書き換えて再起動したところ、Redis は空の AOF で起動し、スナップショットから何も読み込まなかったため、既存のキーはすべて消えました。さらに次に停止したとき、古いキーを含まない新しい内容で dump.rdb まで上書きしました。CONFIG SET ならこれを避けられます。Redis はまずメモリ上のデータから AOF を書き出すからです。再起動後もキーはすべて残っていました。

Redis が空から始まっても困らない純粋なキャッシュなら、逆に redis-cli CONFIG SET save "" で保存を止めましょう。

4. パスワードを設定する

2 つ目の落とし穴です。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 は今、同じ user default の行に SHA-256 ハッシュとして保存しています。再起動後、redis-cli ping は NOAUTH Authentication required. を返し、パスワードを渡したときだけ通りました。redis-cli には REDISCLI_AUTH 変数で渡します。-a を使うとプロセス一覧に表示され、redis-cli も警告を出します。アプリでは Redis の URL に含めます: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 のテストサーバーで、50 クライアントの redis-benchmark の結果です。

テスト毎秒リクエスト数レイテンシ中央値
SET30,3031.0 ms
GET35,1490.9 ms
SET、1 往復あたり 16 コマンド272,1092.4 ms
GET、1 往復あたり 16 コマンド414,9381.3 ms

Web アプリのキャッシュやジョブキューには、必要な量をはるかに超えています。速度の上乗せは、コマンドをまとめて送る(パイプライン)ことで得られています。

どのプランを選ぶか

Redis に必要なのはデータ用の RAM で、それ以外はほとんど要りません。Nano(2 vCPU、1 GB、月 $3)なら maxmemory 256mb で小さなアプリと並べて Redis を動かせます。Micro(2 GB、月 $5)なら、より大きなキャッシュとアプリの両方に余裕があります。ほかのマシンから Redis に直接つなぐ必要があるなら、専用 IPv4(Nano-IP、月 $8 から)を使い、ファイアウォール でそのアドレスだけを許可してください。全プランは VPS ページにあり、支払いは Base、Ethereum、Polygon 上の USDT、USDC、ETH です。

よくある質問

Redis にはどれくらいの RAM が必要ですか?

Redis 自体はごく小さく、当社のサーバーではインストール直後で 13.5 MB でした。必要なのはデータを置く場所です。データはメモリ上にあるからです。maxmemory をサーバーが割ける量、たとえば 1 GB のサーバーなら 256 MB に設定し、いっぱいになったときの動作を選んでください。

Redis と Valkey のどちらがいいですか?

Valkey は Redis 7.2 から分かれた Redis のフォークで、同じプロトコルを話すため、ほとんどのクライアントはどちらでも動きます。Ubuntu 24.04 には Redis 7.0.15 しかありません。Debian 13 には Redis 8.0 と Valkey 8.1 があり、Debian 12 では backports から Valkey 8.0 を入れられます。このガイドの手順はどちらにも当てはまります。

クラッシュ後に Redis のデータが消えるのはなぜですか?

既定では、Redis は変更されたキーの数に応じて数分ごとにスナップショットをディスクに保存します。プロセスを強制終了したところ、最後のスナップショット以降に書いたキーは消えていました。毎秒書き込む AOF を有効にすれば、クラッシュで失うのは最大でも約 1 秒分の書き込みです。

redis.conf に requirepass を追加したのに、なぜ Redis はパスワードなしでコマンドを受け付けるのですか?

おそらく、どこかで CONFIG REWRITE が実行されたためです。Redis 7 では redis.conf の末尾に user default on nopass ~* &* +@all という行が追加され、この行がそれより上に書いた requirepass を打ち消します。CONFIG SET requirepass でパスワードを設定してから CONFIG REWRITE を実行すれば、Redis はその行にパスワードを保存します。

6379 番ポートをインターネットに開けてもいいですか?

やめてください。開いている Redis のポートは常にスキャンされており、サーバーへの侵入経路としてよく使われます。手元のコンピューターからは SSH トンネルで接続するか、Redis を使うアプリと同じサーバーに置いてください。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。