TL;DR クイックフィックス
多くの場合、このエラーはPostgreSQLサーバーが実行されていないか、クライアントからの接続を受け入れるように構成されていないことを示しています。まず、PostgreSQLサービスを再起動してみてください:
sudo systemctl start postgresql
# または、すでに実行中の場合は再起動します
sudo systemctl restart postgresql
単純な再起動で解決しない場合、問題はしばしばpg_hba.confの構成が間違っていることにあります。クライアントのIPアドレス(またはlocalhost)に接続権限があることを確認する必要があります。
詳細な根本原因
エラーメッセージ:
psql: error: connection to server on host "localhost" (127.0.0.1), port 5432 failed: Connection refused
このメッセージは、クライアントアプリケーション(psql)がlocalhost(127.0.0.1)のポート5432でPostgreSQLサーバーに接続しようとしましたが、サーバーが接続試行を明示的に拒否したことを意味します。これは、サーバーがまったく応答しない場合に発生する接続タイムアウトとは異なることに注意することが重要です。
なぜこれが起こるのでしょうか?「Connection refused」エラーの最も一般的な原因は次のとおりです:
- **PostgreSQLサーバーが実行されていない:**これは最も単純な説明です。PostgreSQLサービスがアクティブでない場合、接続を受け入れるものはありません。
- **
postgresql.confのlisten_addressesが正しくない:**PostgreSQLはしばしばlocalhostのみをリッスンするようにデフォルト設定されています。別のマシンから接続しようとしている場合、またはlisten_addressesの設定が間違っている場合、接続は拒否されます。 - **
pg_hba.confでの不適切な認証構成:**サーバーが実行中でリッスンしている場合でも、クライアントアクセスを管理するためにpg_hba.conf(ホストベース認証)に依存します。このファイルは、どのホストがどのデータベースに、どのユーザーで、どの認証方法を使用して接続できるかを指定します。クライアントの接続が承認されたエントリと一致しない場合、アクセスは拒否されます。 - **ファイアウォールによる接続ブロック:**ファイアウォール(Linux上の
ufwやfirewalld、またはWindows Firewallなど)が、サーバー上のポート5432への受信接続をブロックしている可能性があります。 - **ポート番号が正しくない:**PostgreSQLサーバーが標準の5432以外のポートで動作している可能性があります。クライアントが間違ったポートに接続しようとすると、失敗します。
解決アプローチ
1. PostgreSQLサービスの状態を確認する
まず、PostgreSQLサーバーが実際に実行されていることを確認しましょう。使用する正確なコマンドは、オペレーティングシステムとPostgreSQLのインストール方法によって異なります。
Linux (Ubuntu, Debian, CentOS 7+, Fedoraなどのsystemdベースのディストリビューション):
# ステータスを確認
sudo systemctl status postgresql
# 実行中でない場合は開始
sudo systemctl start postgresql
# 実行中だが問題が疑われる場合は再起動
sudo systemctl restart postgresql
# 起動時に有効にする
sudo systemctl enable postgresql
macOS (Homebrewインストールの場合):
# PostgreSQLを開始
brew services start postgresql
# PostgreSQLを再起動
brew services restart postgresql
# ステータスを確認
brew services list | grep postgresql
2. postgresql.confのlisten_addressesを確認する
postgresql.confのlisten_addressesパラメータは、PostgreSQLが受信接続を監視するネットワークインターフェースを決定します。'localhost'に設定されている場合、リモートマシン(または同じホスト上のDockerコンテナ)から接続しようとすると、接続は拒否されます。
postgresql.confを見つける:
# Debian/Ubuntuの場合
sudo find / -name postgresql.conf 2>/dev/null
# 一般的なパス: /etc/postgresql/<version>/main/postgresql.conf
# macOS (Homebrew)の場合
# /usr/local/var/postgres/postgresql.conf
ファイルを見つけたら、開いてlisten_addressesの行を探します:
#postgresql.conf
listen_addresses = 'localhost' # リッスンするIPアドレス;
任意のIPアドレスからの接続を許可するには、次のように変更します。この設定には注意が必要で、適切なセキュリティのために常に堅牢なpg_hba.confルールと組み合わせてください:
#postgresql.conf
listen_addresses = '*'
この変更を行った後、PostgreSQLを再起動することを忘れないでください:
sudo systemctl restart postgresql
3. pg_hba.confでホストベース認証を設定する
pg_hba.confはPostgreSQLのクライアント認証構成ファイルです。誰が、どこから、どのデータベースに、どのような認証方法で接続できるかのルールブックです。
**pg_hba.confを見つける:**このファイルは通常、postgresql.confと同じディレクトリにあります。
pg_hba.confを開きます。接続を許可するためにエントリを追加または変更する必要があります。以下に、いくつかの一般的な例を示します:
パスワードを使用してローカル接続(同じマシンからの接続)を許可するには:
# タイプ データベース ユーザー アドレス メソッド
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
特定のIPアドレス(例:192.168.1.100)からの接続をパスワードを使用して許可するには:
# タイプ データベース ユーザー アドレス メソッド
host all all 192.168.1.100/32 md5
ネットワークサブネット全体(例:192.168.1.0/24内の任意のホスト)からの接続をパスワードを使用して許可するには:
# タイプ データベース ユーザー アドレス メソッド
host all all 192.168.1.0/24 md5
すべての接続を許可するには(細心の注意を払い、開発環境でのみ使用してください!):
# タイプ データベース ユーザー アドレス メソッド
host all all 0.0.0.0/0 md5
**重要:**より強力なパスワードセキュリティのためには、特にPostgreSQL 10以降を使用している場合は、md5をscram-sha-256に置き換えてください。そして、パスワードを持つユーザーを設定していることを確認することが重要です。例えば、ALTER USER youruser WITH PASSWORD 'yourpassword';を使用してパスワードを設定できます。
これらの変更を行った後、PostgreSQLの構成をリロードします。pg_hba.confの更新には、完全な再起動は必要ありません:
sudo systemctl reload postgresql
4. ファイアウォールルールを確認する
システムのファイアウォールが、PostgreSQLのデフォルトポート5432への受信接続をブロックしている可能性があります。
Linux (UFW - Uncomplicated Firewall、Ubuntu/Debianで一般的):
# UFWステータスを確認
sudo ufw status verbose
# ポート5432(PostgreSQLのデフォルトポート)での接続を許可
sudo ufw allow 5432/tcp
# または特定のIPアドレスからの接続を許可
sudo ufw allow from 192.168.1.100 to any port 5432
# 変更を適用するためにUFWをリロード
sudo ufw reload
Linux (firewalld、CentOS/RHEL/Fedoraで一般的):
# firewalldステータスを確認
sudo firewall-cmd --state
# ポート5432での接続を許可
sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --reload
Windows Firewall:
Windowsでは、ファイアウォールを手動で構成する必要があります。**「セキュリティが強化されたWindows Defender ファイアウォール」を開きます。「受信の規則」**に移動し、ポート5432でのTCP接続を具体的に許可する新しい規則を作成します。
5. ポート番号を確認する
クライアントアプリケーションが正しいポートに接続しようとしていることを常に再確認してください。5432がデフォルトですが、postgresql.confファイルで変更できます:
#postgresql.conf
port = 5432 # (変更には再起動が必要です)
この設定を変更した場合、変更を有効にするにはPostgreSQLサービスを再起動する必要があります。
PostgreSQLがデフォルトポートで実行されていない場合は、psqlで接続する際にそれを指定することを忘れないでください:
psql -h localhost -p 5432 -U your_user -d your_database
検証ステップ
修正を適用したら、検証する時です。psqlを使用してPostgreSQLサーバーにもう一度接続してみてください:
psql -h localhost -U postgres -d postgres
localhost、postgres(ユーザー用)、およびpostgres(データベース用)を、あなたの特定の接続詳細に置き換えることを忘れないでください。すべてがうまくいけば、パスワードの入力を求められ(設定されている場合)、その後、通常postgres=#のように見えるpsqlコマンドプロンプトが表示されます。
まだ問題が発生していますか?より詳細なエラーメッセージについては、PostgreSQLサーバーのログを調べてください。これらはしばしば重要な手がかりを提供します。ログファイルの場所は常に一貫しているわけではありませんが、/var/log/postgresql/のようなディレクトリや、PostgreSQLデータディレクトリ内で頻繁に見つけることができます。

