エラー: Redisに接続できませんでした (127.0.0.1:6379): 接続拒否
ウェブアプリケーション、バックグラウンドジョブプロセッサ、またはシンプルなコマンドラインツールでRedisを操作している際に、突然「Could not connect to Redis at 127.0.0.1:6379: Connection refused」というエラーに遭遇することがあります。このメッセージは、接続しようとしたシステムがあなたの接続要求を積極的に拒否したことを意味します。これは開発者や管理者にとってよくある問題であり、Redisサーバー自体、その設定、またはネットワークアクセスに関する問題を示していることが多いです。
このエラーは、Ubuntu、CentOS、Debianなどの一般的なLinuxディストリビューションを含む、さまざまなオペレーティングシステムで頻繁に発生します。macOSユーザーも同様にこのエラーを目にすることがあります。また、特にクライアントアプリケーション(ウェブサーバー、バックグラウンドワーカー、カスタムスクリプトなど)がRedisインスタンスへの接続を確立しようとするときに、Dockerコンテナ内でもよく発生します。
「Connection refused」(接続拒否)エラーを理解する
「Connection refused」(接続拒否)に遭遇した場合、それはRedisが動作しているはずのサーバー上のオペレーティングシステムが、あなたの接続試行を明示的に拒否したことを示しています。「Connection timed out」(接続タイムアウト)エラーとは異なり、こちらはサーバーからの応答が全くないことを意味します。拒否は、サーバーホストがあなたの要求を受信したが、意図的に「ノー」と答えたことを示します。この状況は通常、次の場合に発生します。
- Redisサーバープロセスが全く実行されていない。
- Redisがクライアントアプリケーションが期待するのとは異なるIPアドレスまたはポートでリッスンするように設定されている。
- ファイアウォールがRedisポートへの接続を積極的にブロックしている。
- Redisがクライアントがアクセスできない特定のネットワークインターフェース用に構成されている。
Redis接続拒否の段階的な解決策
ステップ1:Redisサーバーが実行されているか確認する
「Connection refused」(接続拒否)エラーの最も一般的な原因は単純です。Redisサーバープロセスがアクティブではないことです。現在のステータスを確認しましょう。
Linux/macOSの場合(systemdまたはinit.dを使用):
Ubuntu 16.04+やCentOS 7+などの最新のLinuxディストリビューションのほとんどは、systemdに依存しています。より古いシステムを使用している場合は、serviceコマンドが適切かもしれません。
# systemdを使用するシステムの場合 (例: Ubuntu 16.04+、CentOS 7+、Debian 8+)
sudo systemctl status redis-server
# init.dを使用する古いシステムの場合 (例: Ubuntu 14.04、CentOS 6)
sudo service redis-server status
「active (running)」と明確に表示されている出力を探してください。Redisが実行されていない場合は、起動します。
# systemdを使用してRedisを起動する
sudo systemctl start redis-server
# Redisを起動し、起動時に自動的に開始するように設定する
sudo systemctl enable redis-server
# init.dを使用してRedisを起動する
sudo service redis-server start
Dockerの場合:
RedisインスタンスがDockerコンテナ内にある場合は、コンテナのステータスを確認してください。
docker ps
このコマンドは現在実行中のすべてのコンテナをリストします。出力からRedisコンテナを探してください。見つからない場合、コンテナは実行されていません。おそらく起動する必要があります。
# <redis-container-name>をRedisコンテナの実際の名前またはIDに置き換えてください
docker start <redis-container-name>
あるいは、docker-compose.ymlファイルを使用している場合:
docker-compose up -d
ステップ2:Redisの設定(バインドアドレスとポート)を確認する
Redisがアプリケーションが期待するのとは異なるIPアドレスまたはポートでリッスンしている可能性があります。デフォルトのリッスンアドレスは127.0.0.1(localhost)であり、標準ポートは6379であることを覚えておいてください。
Redis設定ファイルを見つけてください。一般的な場所には、Linuxの/etc/redis/redis.confや、手動インストールまたはmacOS Homebrewでよく見られる/usr/local/etc/redis.confがあります。
# Linuxでの一般的な場所
sudo nano /etc/redis/redis.conf
# またはmacOSのHomebrewインストールの場合
nano /usr/local/etc/redis.conf
中に入ったら、これらの主要なディレクティブを調べてください。
-
bindディレクティブ: この設定は、Redisがどのネットワークインターフェースでリッスンするかを制御します。bind 127.0.0.1: Redisはローカルマシン(localhost)からの接続のみを受け入れます。クライアントが別のサーバー(例:192.168.1.50)にある場合、接続できません。# bind 127.0.0.1 ::1: この行がコメントアウトされている(#で始まる)場合、Redisは利用可能なすべてのインターフェースでリッスンする可能性があります。ただし、バインドアドレスを明示的に定義する方が常に明確で安全です。bind 0.0.0.0: これは、Redisが利用可能なすべてのIPv4ネットワークインターフェースでリッスンし、どのIPアドレスからの接続も許可するように指示します。本番環境では注意して使用してください。リモートアクセスが必要な場合は、特定の内部IPにバインドする方が一般的により良いです。bind your_server_ip: Redisが特定のプライベートIP(例:192.168.1.100)を持つサーバーで実行され、アプリケーションが同じネットワーク内の別のマシンから接続する場合、Redisをその特定のIPアドレスにバインドします。
bindアドレスがクライアントの接続を許可していることを確認してください。ローカル接続の場合、127.0.0.1は完璧に機能します。リモート接続の場合、アクセス可能なIPアドレスに調整してください。 -
portディレクティブ: これは、Redisがリッスンに使用するTCPポートを定義します。port 6379: この値がアプリケーションが使用するように設定されているポートと一致するかどうかを再確認してください。
redis.confに何らかの変更を加えた後、新しい設定を有効にするためにRedisサーバーを再起動することを忘れないでください。
sudo systemctl restart redis-server
ステップ3:ファイアウォール規則を確認する
Redisが正常に動作し、正しく設定されている場合でも、ファイアウォールがそのポート(デフォルトは6379)への受信接続を密かにブロックしている可能性があります。
Linuxの場合(ufw - Uncomplicated Firewall、Ubuntu/Debianで一般的):
# UFWの現在のステータスを確認する
sudo ufw status
UFWがアクティブな場合は、ポート6379(またはカスタムのRedisポート)が明示的に許可されていることを確認してください。どこからでも接続できるようにポートを開くには:
sudo ufw allow 6379/tcp
セキュリティを強化するため、アプリケーションサーバーのみが接続する必要がある場合は、そのソースIPを指定します。
# <your_app_server_ip>をアプリケーションサーバーの実際のIPアドレスに置き換えてください
sudo ufw allow from <your_app_server_ip> to any port 6379
Linuxの場合(firewalld、CentOS/RHEL/Fedoraで一般的):
# firewalldのステータスと既存のルールを確認する
sudo firewall-cmd --list-all
firewalldがアクティブな場合は、Redisポートを選択したゾーン(例: publicゾーン)に追加します。
# ポートを永続的に追加する
sudo firewall-cmd --permanent --add-port=6379/tcp
# これらの変更を適用するためにfirewalldをリロードする
sudo firewall-cmd --reload
クラウドプロバイダーのセキュリティグループ/ネットワークACL:
RedisサーバーがAmazon Web Services (AWS)、Google Cloud Platform (GCP)、Microsoft Azureなどのクラウドプラットフォームで動作している場合、それぞれのセキュリティグループまたはネットワークアクセスコントロールリスト(NACL)の規則も確認する必要があります。これらは仮想ファイアウォールとして機能します。Redisポート(デフォルトは6379)でのインバウンド接続が、アプリケーションの特定のIPアドレスまたはサブネット範囲から許可されていることを確認してください。
ステップ4:Redisパスワードを確認する(有効になっている場合)
パスワードの不一致は通常、接続拒否ではなく認証エラーになりますが、それでも確認する価値はあります。Redisサーバーにパスワードが設定されているか、クライアントが正しくパスワードを提供しているかを確認してください。まれに、重大な設定ミスや古いクライアントライブラリが、認証失敗を誤って接続拒否として報告する場合があります。
redis.confファイルでrequirepassディレクティブを確認してください。
requirepass your_strong_password
パスワードが設定されている場合は、クライアントアプリケーションがそれを使用していることを確認してください。redis-cliを使用して素早くテストできます。
redis-cli -h 127.0.0.1 -p 6379 -a your_strong_password
ping
応答としてPONGが表示されるはずで、認証が成功したことを確認できます。
ステップ5:ネットワーク接続を確認する(リモートマシンから接続する場合)
アプリケーションがRedisインスタンスとは異なるサーバーにある場合、まず2つのマシン間の基本的なネットワーク到達性を確認してください。
# アプリケーションサーバーから、RedisサーバーのIPアドレスにpingを試みる
ping <redis_server_ip>
pingが成功した場合、基本的なネットワークパスが開いていることを意味します。次に、Redisポートへの生のTCP接続を確立してみてください。これは、ポート自体を何かブロックしているかどうかを確認するのに役立ちます。
# telnetを使用 (インストールされていない場合: sudo apt install telnet)
telnet <redis_server_ip> 6379
# またはnc (netcat - インストールされていない場合: sudo apt install netcat)
nc -vz <redis_server_ip> 6379
telnetまたはncがすぐに「Connection refused」と表示されるか、単に接続を閉じる場合、それは問題がRedisサーバー側にあることを強く示しています。これは、Redisが実行されていない、バインドアドレスが間違っている、またはRedisサーバー自体のファイアウォールによってブロックされている可能性があるためです。たとえpingが成功した場合でもです。
検証ステップ
上記いずれかの修正を適用した後、次にすぐ行うべきは、常にredis-cliを使用してRedisへの接続を試みることです。これは、サーバーの可用性と応答性を確認する最も直接的な方法です。
Redisサーバー自体から(ローカル接続確認の場合):
redis-cli
ping
Redisがパスワードを要求する場合は、含めてください。
redis-cli -a your_strong_password
ping
PONG応答は、接続と通信が成功したことを確認します。
アプリケーションサーバーから(リモート接続確認の場合、該当する場合):
redis-cli -h <redis_server_ip> -p <redis_port> -a your_strong_password
ping
ここでも、PONGを探してください。redis-cliが接続できるようになったら、アプリケーションを再起動し、ログを監視して、Redisに問題なく接続できることを確認してください。
将来の問題を防ぐためのヒント
-
専用ユーザー: Redisサーバープロセスは常に専用の非特権ユーザーアカウントで実行してください。これにより、Redisプロセスが侵害された場合の潜在的な損害を制限し、セキュリティが大幅に向上します。
-
監視: Redisインスタンスの堅牢な監視を実装してください。Prometheus、Grafana、またはクラウドネイティブの監視ソリューションなどのツールは、Redisプロセスが停止したり到達不能になった場合にすぐに警告を発することができます。これにより、ユーザーに影響を与える前に問題を積極的に対処できます。
-
一貫した構成管理: Redisの構成を文書化し、構成管理ツール(例: Ansible、Puppet、Chef)を使用してください。これにより、設定、特に
bindアドレスとport設定がすべての環境で一貫性を保ち、アプリケーションの期待と一致することが保証されます。 -
ファイアウォール管理: ファイアウォール規則を定期的に確認および監査してください。予期せぬファイアウォール規則の変更は、接続問題の一般的な原因です。常に必要なポートのみを開放し、可能であればソースIPを制限して、セキュリティをさらに強化してください。
-
ネットワークセグメンテーション: 複雑なIT環境では、ネットワークセグメンテーションを活用してRedisインスタンスを分離してください。これにより、Redisサーバーを独自の保護されたネットワークセグメントに維持することで、より厳格なセキュリティポリシーを強制し、不正アクセスを防止できます。

