PostgreSQL をインストールすると、デフォルトでは TCP/IP を使用したデータベースへの接続は許可されません。
psql コマンドを使用してクライアントからリモート PostgreSQL データベースに接続しようとすると、「psql:サーバーに接続できませんでした:接続が拒否されました」というエラー メッセージが表示される場合があります。
次の例では、クライアント マシンから、192.168.102.1 サーバーで実行されている PostgreSQL データベースに接続しようとしています。出力からわかるように、リモート PostgreSQL データベースが接続を受け入れていないことが明確に示されています。
# psql -U postgres -h 192.168.102.1 psql: could not connect to server: Connection refused Is the server running on host "192.168.102.1" and accepting TCP/IP connections on port 5432?
PostgreSQL データベースの TCP/IP 接続を有効にするには、以下の 2 つの手順に従う必要があります。
1. pg_hba.conf を変更して、クライアント認証レコードを追加します
PostgreSQL データベース サーバーでは、デフォルトで、/var/lib/pgsql/data/pg_hba.conf の末尾に向かって次のレコードが表示されます。以下に示すように、localhost からの接続のみを受け入れます。
# IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 ident
次の行を pg_hba.conf サーバーに追加します。これにより、「192.168.101.20」IP アドレスからの接続が許可されます (これは、この例のクライアントです)。特定のネットワーク上の複数のクライアント マシンからの接続を許可する場合は、ここでネットワーク アドレスを CIDR アドレス形式で指定します。
# vi /var/lib/pgsql/data/pg_hba.conf host all all 192.168.101.20/24 trust
以下は、pg_hba.conf ファイルでサポートされているさまざまなクライアント認証レコード形式です。このリストの #2 形式を使用しています。
- ローカル データベース ユーザーの認証方法 [認証オプション]
- ホスト データベース ユーザー CIDR-アドレス 認証方法 [認証オプション]
- hostssl データベース ユーザー CIDR-アドレス 認証方法 [認証オプション]
- hostnossl データベース ユーザー CIDR-address 認証方法 [認証オプション]
「CIDR アドレス」形式の代わりに、次のレコード形式を使用して、IP アドレスとネットワーク マスクを別々のフィールドに指定することもできます。
- ホスト データベース ユーザーの IP アドレス IP マスク 認証方法 [認証オプション]
- hostssl データベース ユーザーの IP アドレス IP マスク 認証方法 [認証オプション]
- hostnossl データベース ユーザーの IP アドレス IP マスク 認証方法 [認証オプション]
2. postgresql.conf のリッスン アドレスを変更する
PostgreSQL データベース サーバーでは、以下に示すように、デフォルトでリッスン アドレスは postgresql.conf ファイルの localhost になります。
# grep listen /var/lib/pgsql/data/postgresql.conf listen_addresses = 'localhost'
この行を変更して、*.サーバーに複数のインターフェースがある場合は、リッスンする特定のインターフェースを指定することもできます。
# grep listen /var/lib/pgsql/data/postgresql.conf listen_addresses = '*'
3.リモート接続をテストする
ここで、クライアント マシン 192.168.101.20 にログインし、以下に示すように PostgreSQL データベース サーバー (192.168.102.1) への psql リモート接続を実行します。今回はうまくいくはずです。
# psql -U postgres -h 192.168.102.1 Welcome to psql 8.1.11 (server 8.4.18), the PostgreSQL interactive terminal. postgres=#
また、毎回コマンド ライン パラメータでホスト名を指定したくない場合は、以下に示すように、PGHOST 環境変数名でリモート PostgreSQL データベースの IP アドレスを設定できます。
# export PGHOST=192.168.102.1 # psql -U postgres Welcome to psql 8.1.11 (server 8.4.18), the PostgreSQL interactive terminal. postgres=#