問題の背景Redisインスタンスを管理している際、CONFIG SETコマンドを使用して動的に設定を変更することはよくあります。例えば、サービスを再起動せずにmaxmemoryを増やしたり、appendonlyの状態を変更したりする場合です。これらの変更を永続化するための標準的な方法は、以下のコマンドを実行することです。
127.0.0.1:6379> CONFIG REWRITE
しかし、次のような特定のエラーメッセージが表示されることがあります。
(error) ERR The server is running without a config file
これは、Redisが物理的なredis.confファイルへのポインタなしで、単独のプロセスとして起動されたために発生します。Redisが設定ファイルの場所を認識していない場合、変更を保存するためにファイルを書き換えることができません。
なぜこのエラーが発生するのかRedisの起動方法には2つあります。1つは、引数として設定ファイルのパスを指定する方法です。もう1つは、バイナリのみを実行する方法で、この場合Redisは組み込みのデフォルト値を使用します。後者の方法を使用すると、Redisの設定に関してはすべてメモリ上で動作します。CONFIG REWRITEを実行すると、エンジンは初期化時に使用されたファイルパスを探します。パスが見つからないため、更新対象のファイルが存在しないというエラーがスローされます。
この状況を招く一般的なシナリオは以下の通りです。
redis-server /path/to/redis.confではなく、redis-serverで手動でサーバーを起動している。- Dockerコンテナにおいて、コマンドが単にredis-serverとなっており、設定ファイルがマッピングまたは指定されていない。- Systemdのユニットファイルにおいて、ExecStartディレクティブに設定ファイルの引数が不足している。## セットアップのデバッグ修正を適用する前に、Redisプロセスがどのように起動されたかを確認してください。Linuxシステムでは、psコマンドを使用して実行中のプロセスを調査します。
ps aux | grep redis-server
出力が以下のようであれば、問題が確認されたことになります。
redis 1234 0.1 0.5 150000 10000 ? Ssl 10:00 0:01 /usr/bin/redis-server *:6379
ポート番号の後にファイルパスがないことに注目してください。正しく設定されたインスタンスは、以下のようになります。
redis 1234 0.1 0.5 150000 10000 ? Ssl 10:00 0:01 /usr/bin/redis-server /etc/redis/redis.conf
解決策### 方法1:設定ファイルを使用して再起動する(推奨)最も確実な修正方法は、Redisが設定ファイルを使用して起動するようにすることです。設定ファイルがない場合は、公式のRedis GitHubリポジトリから、使用しているバージョンに対応するデフォルトのredis.confをダウンロードできます。
- 設定ファイルを作成または配置します(通常は
/etc/redis/redis.conf)。- 現在のRedisインスタンスを停止します:redis-cli shutdown- 設定ファイルのパスを明示的に指定してRedisを起動します:redis-server /etc/redis/redis.confSystemdを使用している場合は、/etc/systemd/system/redis.serviceまたは/lib/systemd/system/redis.serviceにあるサービスファイルを確認してください。ExecStartの行にパスが含まれていることを確認します。
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
方法2:Docker環境の修正Dockerでは、コンテナがデフォルトのエントリポイントで起動されるため、このエラーが頻繁に発生します。これを修正するには、ローカルの設定ファイルをコンテナ内にマウントし、docker-compose.ymlまたはdocker runコマンドでそのファイルを使用するようRedisに指示する必要があります。
docker-compose.ymlのスニペット例:
services:
redis:
image: redis:latest
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
方法3:再起動しない回避策Redisを再起動するためのダウンタイムを確保できないが、現在の実行時の設定をどうしても保存する必要がある場合は、現在の状態から手動でファイルを作成できます。これはやや強引な手法ですが、緊急時には有効です。
- Redisに接続し、現在のすべての設定を取得します:
redis-cli CONFIG GET * > current_config.txt- この出力はredis.confの形式ではありません(改行区切りのキーと値のペアです)。手動またはスクリプトを使用して、key value形式に整形する必要があります。- 有効なredis.confを作成した後も、将来的にCONFIG REWRITEを有効にするには、そのファイルを使用してRedisを再起動する必要があります。再起動なしで、実行中のRedisプロセスに設定ファイルを「アタッチ」する方法はありません。## 検証設定ファイルのパスを指定してRedisを再起動したら、修正が機能するか確認します。 redis-cliで接続します。- ダミーのパラメータを変更します:127.0.0.1:6379> CONFIG SET loglevel notice- 書き換えを実行します: ``` 127.0.0.1:6379> CONFIG REWRITE ````OKが返ってくれば、修正は成功です。また、ファイルシステム上のredis.conf`ファイルのタイムスタンプを確認することもできます。コマンドを実行した時刻が反映されているはずです。

