PostgreSQLのポート番号を確認・変更する完全ガイド!5432以外の設定からトラブル解決まで

データベース・SQL

「PostgreSQLに接続できない…ポート番号が違うのかな?」 「複数のPostgreSQLが動いていて、どれがどのポートか分からない」 「セキュリティのためにデフォルトポートを変更したい」

PostgreSQLのポート番号、普段は意識しないかもしれません。 でも、接続トラブルの原因の約30%はポート番号の設定ミスなんです。

デフォルトは「5432」ですが、 実は環境によって違うポートで動いていることがよくあります。

この記事では、PostgreSQLのポート番号を確認する全方法から、 変更方法、そしてトラブル解決まで、すべてお伝えします。

接続の問題を解決して、スムーズな開発環境を手に入れましょう!


スポンサーリンク
  1. 1. PostgreSQLのポート番号、基本を理解しよう
    1. 🔌 ポート番号とは?
    2. 🔌 なぜポート番号の確認が必要?
  2. 2. 【即効】ポート番号を確認する5つの方法
    1. 方法1️⃣ psqlコマンドで確認(最も簡単)
    2. 方法2️⃣ 設定ファイル(postgresql.conf)で確認
    3. 方法3️⃣ システムプロセスから確認
    4. 方法4️⃣ pg_settingsビューで確認
    5. 方法5️⃣ pgAdminやDBeaverなどのGUIツールで確認
  3. 3. 複数のPostgreSQLインスタンスがある場合
    1. 🔍 全インスタンスのポート番号を一覧表示
    2. 🔍 Dockerコンテナの場合
  4. 4. ポート番号を変更する方法
    1. 🔧 postgresql.confを編集
    2. 🔧 一時的な変更(テスト用)
    3. 🔧 環境変数での指定
  5. 5. 接続文字列でのポート指定
    1. 🔗 各種接続方法でのポート指定
  6. 6. ファイアウォールとポート開放
    1. 🛡️ Linux(Ubuntu/Debian)
    2. 🛡️ Linux(CentOS/RHEL)
    3. 🛡️ Windows
    4. 🛡️ macOS
  7. 7. トラブルシューティング
    1. ❌ エラー:Connection refused
    2. ❌ エラー:Port 5432 already in use
    3. ❌ 複数バージョンの競合
  8. 8. セキュリティのベストプラクティス
    1. 🔒 ポート番号変更によるセキュリティ強化
    2. 🔒 ポートスキャン対策
    3. 🔒 SSL/TLS接続の強制
  9. 9. 便利なスクリプトとツール
    1. 🛠️ ポート確認スクリプト
    2. 🛠️ ポート変更自動化スクリプト
    3. 🛠️ 接続テストツール
  10. 10. よくある質問(FAQ)
    1. ❓ デフォルトポート5432を変更すべき?
    2. ❓ ポート番号は何番を使えばいい?
    3. ❓ Dockerでポートが競合する
    4. ❓ AWSやGCPでのポート設定は?
    5. ❓ pgBouncerやPgPoolを使う場合は?
  11. まとめ:ポート番号を制する者は接続を制す!
    1. 🚀 次のステップ

1. PostgreSQLのポート番号、基本を理解しよう

🔌 ポート番号とは?

ポート番号は、コンピュータの「部屋番号」のようなものです。

建物(サーバー) = IPアドレス
部屋番号 = ポート番号
PostgreSQL = 5432号室(デフォルト)

よく使われるポート番号:

  • PostgreSQL: 5432(デフォルト)
  • MySQL: 3306
  • MongoDB: 27017
  • Redis: 6379
  • HTTP: 80
  • HTTPS: 443

🔌 なぜポート番号の確認が必要?

主な理由:

  1. 接続設定の確認
    • アプリケーションの接続文字列設定
    • データベースクライアントの設定
  2. 複数インスタンスの管理
    • 開発用:5432
    • テスト用:5433
    • 本番用:5434
  3. セキュリティ対策
    • デフォルトポートは攻撃対象になりやすい
    • カスタムポートで防御力UP
  4. ファイアウォール設定
    • 正しいポートを開放する必要

2. 【即効】ポート番号を確認する5つの方法

方法1️⃣ psqlコマンドで確認(最も簡単)

# PostgreSQLに接続中の場合
psql -U postgres -c "SHOW port;"

# 結果
# port 
# ------
# 5432

接続していない場合:

# 接続しながら確認
psql -U postgres -d postgres -c "SELECT current_setting('port');"

方法2️⃣ 設定ファイル(postgresql.conf)で確認

Linux/macOSの場合:

# 設定ファイルの場所を探す
sudo find / -name "postgresql.conf" 2>/dev/null

# よくある場所
/etc/postgresql/14/main/postgresql.conf  # Ubuntu/Debian
/var/lib/pgsql/14/data/postgresql.conf   # CentOS/RHEL
/usr/local/var/postgres/postgresql.conf  # macOS Homebrew

設定を確認:

# ポート設定を抽出
grep "^port" /path/to/postgresql.conf

# 結果例
port = 5432  # (change requires restart)

Windowsの場合:

# PowerShellで確認
Get-Content "C:\Program Files\PostgreSQL\14\data\postgresql.conf" | Select-String "^port"

方法3️⃣ システムプロセスから確認

Linux/macOS:

# 実行中のPostgreSQLプロセスを確認
sudo netstat -tulpn | grep postgres

# または
sudo ss -tulpn | grep postgres

# macOSの場合
sudo lsof -i -P | grep postgres

# 結果例
tcp  0  0  0.0.0.0:5432  0.0.0.0:*  LISTEN  1234/postgres

Windows:

# コマンドプロンプトで確認
netstat -an | findstr :543

# PowerShellで詳細確認
Get-NetTCPConnection | Where-Object {$_.LocalPort -like "543*"}

方法4️⃣ pg_settingsビューで確認

-- PostgreSQLに接続後
SELECT name, setting, unit, category, short_desc 
FROM pg_settings 
WHERE name = 'port';

-- より詳細な情報
SELECT 
    name,
    setting AS current_value,
    boot_val AS default_value,
    reset_val AS session_value,
    sourcefile,
    sourceline
FROM pg_settings 
WHERE name = 'port';

方法5️⃣ pgAdminやDBeaverなどのGUIツールで確認

pgAdmin4での確認:

  1. サーバーを右クリック
  2. 「Properties」を選択
  3. 「Connection」タブを確認
  4. 「Port」フィールドに表示

DBeaverでの確認:

  1. 接続を右クリック
  2. 「Edit Connection」を選択
  3. 「Main」タブの「Port」を確認

3. 複数のPostgreSQLインスタンスがある場合

🔍 全インスタンスのポート番号を一覧表示

# すべてのPostgreSQLプロセスとポートを表示
sudo ps aux | grep postgres | grep -- "-p"

# より詳細な情報(Linux)
sudo ss -tulpn | grep postgres | awk '{print $5}' | cut -d: -f2 | sort -u

# プロセスとポートの対応表を作成
for pid in $(pgrep postgres); do
    port=$(sudo lsof -Pan -p $pid -i | grep LISTEN | awk '{print $9}' | cut -d: -f2)
    if [ ! -z "$port" ]; then
        echo "PID: $pid, Port: $port"
    fi
done

🔍 Dockerコンテナの場合

# Dockerで動いているPostgreSQLのポート確認
docker ps --filter "ancestor=postgres" --format "table {{.Names}}\t{{.Ports}}"

# 特定のコンテナの詳細
docker inspect postgres_container | grep -A 10 "PortBindings"

# docker-compose.ymlの確認
cat docker-compose.yml | grep -A 2 postgres

docker-compose.yml例:

services:
  postgres_dev:
    image: postgres:14
    ports:
      - "5432:5432"  # ホスト:コンテナ
  
  postgres_test:
    image: postgres:14
    ports:
      - "5433:5432"  # 別ポートにマッピング

4. ポート番号を変更する方法

🔧 postgresql.confを編集

手順1:設定ファイルを編集

# バックアップを作成
sudo cp /path/to/postgresql.conf /path/to/postgresql.conf.backup

# 編集
sudo nano /path/to/postgresql.conf

変更箇所:

# デフォルト
#port = 5432

# 変更後(例:5433に変更)
port = 5433

# 特定のIPアドレスにバインド
#listen_addresses = 'localhost'
listen_addresses = '*'  # すべてのIPアドレスで待ち受け

手順2:PostgreSQLを再起動

# Ubuntu/Debian
sudo systemctl restart postgresql

# CentOS/RHEL
sudo systemctl restart postgresql-14

# macOS
brew services restart postgresql

# Windows(管理者権限で)
net stop postgresql-x64-14
net start postgresql-x64-14

🔧 一時的な変更(テスト用)

# コマンドラインオプションで起動
postgres -D /path/to/data -p 5433

# pg_ctlを使う場合
pg_ctl -D /path/to/data -o "-p 5433" start

🔧 環境変数での指定

# 環境変数を設定
export PGPORT=5433

# この環境変数を使ってpsqlが接続
psql -U postgres  # 自動的に5433ポートに接続

5. 接続文字列でのポート指定

🔗 各種接続方法でのポート指定

psqlコマンド:

# -p オプションで指定
psql -h localhost -p 5433 -U postgres -d mydb

# 接続文字列形式
psql "postgresql://postgres:password@localhost:5433/mydb"

プログラミング言語での接続:

Python (psycopg2):

import psycopg2

# 方法1:個別パラメータ
conn = psycopg2.connect(
    host="localhost",
    port=5433,  # ポート指定
    database="mydb",
    user="postgres",
    password="password"
)

# 方法2:接続文字列
conn = psycopg2.connect(
    "postgresql://postgres:password@localhost:5433/mydb"
)

Node.js (pg):

const { Pool } = require('pg');

// 方法1:設定オブジェクト
const pool = new Pool({
    host: 'localhost',
    port: 5433,  // ポート指定
    database: 'mydb',
    user: 'postgres',
    password: 'password'
});

// 方法2:接続文字列
const pool = new Pool({
    connectionString: 'postgresql://postgres:password@localhost:5433/mydb'
});

Java (JDBC):

// JDBC URL形式
String url = "jdbc:postgresql://localhost:5433/mydb";
Properties props = new Properties();
props.setProperty("user", "postgres");
props.setProperty("password", "password");
Connection conn = DriverManager.getConnection(url, props);

Ruby (pg gem):

require 'pg'

# 接続
conn = PG.connect(
    host: 'localhost',
    port: 5433,  # ポート指定
    dbname: 'mydb',
    user: 'postgres',
    password: 'password'
)

6. ファイアウォールとポート開放

🛡️ Linux(Ubuntu/Debian)

ufw(Uncomplicated Firewall):

# 現在の状態確認
sudo ufw status verbose

# PostgreSQLのデフォルトポートを開放
sudo ufw allow 5432/tcp

# 特定のIPアドレスからのみ許可
sudo ufw allow from 192.168.1.0/24 to any port 5432

# カスタムポートの場合
sudo ufw allow 5433/tcp

# 設定を有効化
sudo ufw enable

iptables:

# ポート5432を開放
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

# 特定のIPからのみ
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -j ACCEPT

# 設定を保存
sudo iptables-save > /etc/iptables/rules.v4

🛡️ Linux(CentOS/RHEL)

firewalld:

# PostgreSQLサービスを追加
sudo firewall-cmd --permanent --add-service=postgresql

# カスタムポートの場合
sudo firewall-cmd --permanent --add-port=5433/tcp

# 設定を再読み込み
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-all

🛡️ Windows

Windows Defender ファイアウォール:

# PowerShell(管理者権限)で実行

# インバウンドルールを追加
New-NetFirewallRule -DisplayName "PostgreSQL" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 5432 `
    -Action Allow

# 特定のプログラムに対して許可
New-NetFirewallRule -DisplayName "PostgreSQL Server" `
    -Direction Inbound `
    -Program "C:\Program Files\PostgreSQL\14\bin\postgres.exe" `
    -Action Allow

🛡️ macOS

# pfctl(Packet Filter)の設定
echo "pass in proto tcp from any to any port 5432" | sudo tee -a /etc/pf.conf

# 設定を有効化
sudo pfctl -e -f /etc/pf.conf

7. トラブルシューティング

❌ エラー:Connection refused

原因と対策:

# 1. PostgreSQLが起動しているか確認
sudo systemctl status postgresql

# 2. ポートが正しいか確認
psql -U postgres -c "SHOW port;"

# 3. プロセスがポートをリッスンしているか
sudo netstat -tulpn | grep 5432

# 4. postgresql.confのlisten_addressesを確認
grep "listen_addresses" /path/to/postgresql.conf
# localhost のみか、* になっているか確認

❌ エラー:Port 5432 already in use

対処法:

# 1. 使用中のプロセスを特定
sudo lsof -i :5432

# 2. プロセスを確認
ps aux | grep [プロセスID]

# 3. 必要に応じて停止
sudo kill -15 [プロセスID]

# 4. 別のポートを使用
postgres -D /path/to/data -p 5433

❌ 複数バージョンの競合

# インストール済みのPostgreSQLを確認
# Ubuntu/Debian
dpkg -l | grep postgresql

# CentOS/RHEL
rpm -qa | grep postgresql

# 各バージョンのポート確認
for version in 12 13 14; do
    echo "PostgreSQL $version:"
    sudo grep "^port" /etc/postgresql/$version/main/postgresql.conf 2>/dev/null
done

8. セキュリティのベストプラクティス

🔒 ポート番号変更によるセキュリティ強化

# 1. 非標準ポートを使用(例:15432)
port = 15432

# 2. 特定のIPアドレスのみ許可
listen_addresses = '192.168.1.100,127.0.0.1'

# 3. pg_hba.confで接続元を制限
# IPv4 local connections:
host    all    all    192.168.1.0/24    scram-sha-256
host    all    all    127.0.0.1/32      scram-sha-256

🔒 ポートスキャン対策

# fail2banの設定(Linux)
# /etc/fail2ban/jail.local

[postgresql]

enabled = true port = 5432 filter = postgresql logpath = /var/log/postgresql/postgresql-*.log maxretry = 3 bantime = 3600

🔒 SSL/TLS接続の強制

# postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'

# pg_hba.conf
# SSL接続のみ許可
hostssl    all    all    0.0.0.0/0    scram-sha-256

9. 便利なスクリプトとツール

🛠️ ポート確認スクリプト

#!/bin/bash
# check_pg_ports.sh - PostgreSQLの全ポートを確認

echo "=== PostgreSQL Port Check ==="
echo ""

# 設定ファイルから確認
echo "1. Configuration files:"
for conf in $(find /etc /var /usr -name "postgresql.conf" 2>/dev/null); do
    port=$(grep "^port" "$conf" 2>/dev/null | cut -d= -f2 | tr -d ' ')
    echo "   Config: $conf"
    echo "   Port: ${port:-5432 (default)}"
done

echo ""
echo "2. Running processes:"
# 実行中のプロセス確認
if command -v ss &> /dev/null; then
    sudo ss -tulpn | grep postgres
elif command -v netstat &> /dev/null; then
    sudo netstat -tulpn | grep postgres
fi

echo ""
echo "3. Docker containers:"
docker ps --filter "ancestor=postgres" --format "table {{.Names}}\t{{.Ports}}" 2>/dev/null || echo "   No Docker containers found"

🛠️ ポート変更自動化スクリプト

#!/bin/bash
# change_pg_port.sh - PostgreSQLのポート変更を自動化

OLD_PORT=${1:-5432}
NEW_PORT=${2:-5433}
PG_VERSION=${3:-14}

echo "Changing PostgreSQL port from $OLD_PORT to $NEW_PORT..."

# バックアップ作成
sudo cp /etc/postgresql/$PG_VERSION/main/postgresql.conf{,.backup}

# ポート変更
sudo sed -i "s/port = $OLD_PORT/port = $NEW_PORT/g" /etc/postgresql/$PG_VERSION/main/postgresql.conf

# PostgreSQL再起動
sudo systemctl restart postgresql

# 確認
sleep 2
if sudo netstat -tulpn | grep -q ":$NEW_PORT"; then
    echo "✓ Port successfully changed to $NEW_PORT"
else
    echo "✗ Failed to change port"
    # ロールバック
    sudo cp /etc/postgresql/$PG_VERSION/main/postgresql.conf{.backup,}
    sudo systemctl restart postgresql
fi

🛠️ 接続テストツール

#!/usr/bin/env python3
# test_pg_connection.py - PostgreSQL接続テスト

import sys
import psycopg2
from psycopg2 import OperationalError

def test_connection(host, port, database, user, password):
    try:
        conn = psycopg2.connect(
            host=host,
            port=port,
            database=database,
            user=user,
            password=password,
            connect_timeout=3
        )
        
        cursor = conn.cursor()
        cursor.execute("SELECT version();")
        version = cursor.fetchone()[0]
        
        print(f"✓ Successfully connected to port {port}")
        print(f"  PostgreSQL version: {version}")
        
        cursor.close()
        conn.close()
        return True
        
    except OperationalError as e:
        print(f"✗ Failed to connect to port {port}")
        print(f"  Error: {e}")
        return False

if __name__ == "__main__":
    # テスト対象のポート
    ports = [5432, 5433, 5434]
    
    for port in ports:
        print(f"\nTesting port {port}...")
        test_connection(
            host="localhost",
            port=port,
            database="postgres",
            user="postgres",
            password="password"
        )

10. よくある質問(FAQ)

❓ デフォルトポート5432を変更すべき?

答え:環境によります

変更を推奨する場合:

  • インターネットに公開されるサーバー
  • 複数のPostgreSQLインスタンス運用
  • セキュリティ要件が厳しい環境

変更不要な場合:

  • ローカル開発環境
  • プライベートネットワーク内のみ
  • Dockerコンテナ内部

❓ ポート番号は何番を使えばいい?

答え:用途別の推奨番号

開発環境: 5432(デフォルト)
テスト環境: 5433
ステージング: 5434
本番環境: 15432(5桁の非標準ポート)

複数バージョン運用:
PostgreSQL 12: 5432
PostgreSQL 13: 5433
PostgreSQL 14: 5434
PostgreSQL 15: 5435

❓ Dockerでポートが競合する

答え:ホスト側のポートを変更

# docker-compose.yml
services:
  postgres:
    image: postgres:14
    ports:
      - "15432:5432"  # ホスト:コンテナ
    # コンテナ内部は5432のまま
    # ホスト側は15432でアクセス

❓ AWSやGCPでのポート設定は?

答え:セキュリティグループで制御

AWS RDS:

  • デフォルト:5432
  • セキュリティグループでインバウンドルール設定
  • カスタムポート可能(1150-65535)

Google Cloud SQL:

  • デフォルト:5432
  • VPCファイアウォールルールで制御
  • プライベートIPの使用を推奨

❓ pgBouncerやPgPoolを使う場合は?

答え:プロキシのポートを考慮

クライアント → pgBouncer(6432) → PostgreSQL(5432)
クライアント → PgPool(9999) → PostgreSQL(5432)

まとめ:ポート番号を制する者は接続を制す!

PostgreSQLのポート番号確認と設定、思った以上に重要ですよね。 適切に管理すれば、接続トラブルを防ぎ、セキュリティも向上します。

重要ポイントのおさらい:

確認方法は複数ある

  • psqlコマンド:SHOW port;
  • 設定ファイル:postgresql.conf
  • プロセス確認:netstat, ss, lsof

デフォルトは5432

  • 変更する場合は再起動が必要
  • listen_addressesも忘れずに確認

セキュリティを考慮

  • 本番環境では非標準ポート推奨
  • ファイアウォール設定を忘れずに
  • 必要最小限のIPからのみ許可

トラブル時の確認順序

  1. PostgreSQLが起動しているか
  2. ポート番号が正しいか
  3. ファイアウォールが開いているか
  4. 接続文字列が正しいか

チェックリスト:

  • [ ] 現在のポート番号を確認した
  • [ ] postgresql.confの場所を把握した
  • [ ] ファイアウォール設定を確認した
  • [ ] 接続文字列を更新した
  • [ ] バックアップを作成した

🚀 次のステップ

今すぐやるべきこと:

  1. psql -c "SHOW port;" で現在のポート確認
  2. netstatss でリッスン状態確認
  3. 接続文字列の見直し

セキュリティ強化のために:

  1. 非標準ポートへの変更を検討
  2. SSL/TLS接続の設定
  3. pg_hba.confでアクセス制限

この記事が、PostgreSQLのポート管理と 接続トラブル解決に役立つことを願っています!

正確なポート設定で、安定した接続環境を構築しましょう!

コメント

タイトルとURLをコピーしました