2026年7月30日
2026年7月30日
PostgreSQLのインストールと初期設定方法(Ubuntu・RHEL系、接続設定とユーザー作成まで)
PostgreSQL は、OS のパッケージか PostgreSQL 公式のリポジトリ(PGDG)からインストールし、そのあと「接続を受け付ける範囲」「認証方式」「アプリ用のユーザーとデータベース」の3点を設定すれば、アプリから使える状態になります。この記事では、Ubuntu・Debian 系と RHEL 系(Rocky Linux、AlmaLinux など)でのインストール、最初に確認する設定ファイル、pg_hba.conf による接続制限、ユーザーとデータベースの作り方、メモリまわりの初期値、バックアップの準備までを順に説明します。
なお、WordPress のコアは MySQL と MariaDB を対象にしており、PostgreSQL は公式にはサポートされていません。この記事は、WordPress と同じサーバーで動かす別のアプリや、分析用のデータベースとして PostgreSQL を使う場面を想定しています。
バージョンとインストール元を選ぶ
PostgreSQL はおおむね毎年秋に新しいメジャーバージョンが出て、各メジャーバージョンは約5年間保守されます。新しく構築するなら、公式サイトのバージョン方針のページで、保守期間が長く残っているバージョンを選びます(2026年10月現在の状況は公式サイトで確認してください)。
インストール元は2つあります。
- OS のパッケージ:手軽で、OS のセキュリティ更新と一緒に管理できます。ただし、入るメジャーバージョンは OS のリリースごとに固定です。
- PGDG のリポジトリ:PostgreSQL のプロジェクトが提供するリポジトリで、新しいメジャーバージョンも選べます。アプリが特定のバージョンを求める場合はこちらを使います。
以下の例では、メジャーバージョンを 18 として書いています。実際に使うバージョンの数字に読み替えてください。
Ubuntu・Debian 系でのインストール
OS のパッケージをそのまま使うなら、次の1行で入ります。
sudo apt update
sudo apt install -y postgresql
PGDG のリポジトリを使う場合は、postgresql-common に含まれる設定用スクリプトでリポジトリを追加してから、バージョンを指定して入れます。
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install -y postgresql-18
Debian 系では、インストールと同時にデータベースの「クラスタ」(1つのサーバープロセスが管理するデータの集まり)が作られ、サービスも起動します。状態は次のコマンドで確認します。
pg_lsclusters
sudo systemctl status postgresql@18-main
設定ファイルは /etc/postgresql/18/main/ に、データは /var/lib/postgresql/18/main/ に置かれます。
RHEL 系でのインストール
RHEL 系では、PGDG のリポジトリ用パッケージを入れ、OS 標準の PostgreSQL モジュールを無効にしてから入れるのが一般的な手順です。リポジトリ用パッケージの URL は OS のバージョンによって変わるため、公式サイトのダウンロードページで、自分の環境を選んで表示されるコマンドを使ってください。
# 例:EL 9 系・x86_64 の場合(URL は公式のダウンロードページで確認する)
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql18-server
# クラスタの初期化と起動
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable --now postgresql-18
RHEL 系では、Debian 系と違ってクラスタは自動では作られないため、initdb を実行します。設定ファイルとデータは、どちらも /var/lib/pgsql/18/data/ に置かれます。
最初の接続と文字コードの確認
インストール直後は、OS の postgres ユーザーだけが、データベースの管理者ロール postgres として接続できます。この方式は、同じサーバー内のソケット接続で OS のユーザー名を確認する peer 認証によるものです。
sudo -u postgres psql
接続できたら、まずクラスタの文字コードとロケールを確認します。
\l
SHOW server_encoding;
Encoding が UTF8 になっていれば、日本語のデータを扱えます。Debian 系では、クラスタ作成時の OS のロケール設定が引き継がれるため、最小構成のサーバーなどで想定と違う値になっていることがあります。データを入れてからの変更は手間がかかるので、この時点で確認しておきます。
アプリ用のユーザーとデータベースを作る
アプリから管理者ロール postgres で接続するのは避け、アプリごとにロールとデータベースを分けます。
# パスワードを対話で入力する(シェルの履歴に残さないため)
sudo -u postgres createuser --pwprompt appuser
sudo -u postgres createdb --owner=appuser appdb
--owner でデータベースの所有者をアプリ用のロールにしておくと、そのロールがデータベース内でテーブルを作れます。PostgreSQL 15 以降では、public スキーマに誰でもテーブルを作れる、という以前の既定の権限が外されているため、古い手順のまま所有者を指定せずに作ると、権限エラーになることがあります。
SQL で作る場合も、パスワードは \password で対話的に設定すると、ログや履歴に残りにくくなります。
CREATE ROLE appuser LOGIN;
\password appuser
CREATE DATABASE appdb OWNER appuser;
接続を受け付ける範囲を設定する
既定では、PostgreSQL は同じサーバーからの接続(localhost)だけを受け付けます。アプリが同じサーバーにあるなら、この設定のままにしておくのが安全です。
別のサーバーから接続する必要がある場合は、2つの設定を変えます。
1. 待ち受けるアドレス(postgresql.conf)
# 全アドレスではなく、必要なネットワーク側のアドレスだけを指定する
listen_addresses = 'localhost,10.0.0.5'
この設定は再起動しないと反映されません。
2. 接続の許可と認証方式(pg_hba.conf)
# TYPE DATABASE USER ADDRESS METHOD
host appdb appuser 10.0.0.0/24 scram-sha-256
pg_hba.conf は上から順に評価され、最初に一致した行が使われます。データベース名・ユーザー名・接続元をできるだけ絞り、認証方式には scram-sha-256 を使います。trust はパスワードなしで接続を許す設定なので、検証目的でも外部からの接続には使わないでください。古い資料にある md5 は互換のために残っている方式で、PostgreSQL 14 以降はパスワードの保存方式の既定が scram-sha-256 になっています。
pg_hba.conf の変更は再読み込みで反映できます。
sudo systemctl reload postgresql@18-main # Debian 系
sudo systemctl reload postgresql-18 # RHEL 系
あわせて、ファイアウォールでポート 5432 を接続元のネットワークだけに開けます。データベースのポートをインターネット全体に公開するのは避けてください。
sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
メモリまわりの初期値を見直す
PostgreSQL の既定値は、小さなマシンでも起動できるよう控えめに設定されています。専用のサーバーで使うなら、最低限次の値を見直します。
shared_buffers:PostgreSQL が使う共有メモリ。公式ドキュメントでは、専用サーバーなら物理メモリの25%程度が出発点として挙げられています。effective_cache_size:OS のファイルキャッシュも含めて、どれだけメモリが使えるかの目安。実際にメモリを確保する設定ではなく、実行計画の判断に使われます。work_mem:並べ替えなどに使うメモリ。1つのクエリの中で複数回使われ、接続数分だけ掛け算で増えるため、大きくしすぎるとメモリが足りなくなります。
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET effective_cache_size = '3GB';
ALTER SYSTEM は postgresql.auto.conf に書き込み、postgresql.conf より優先されます。shared_buffers は再起動が必要です。値はメモリ4GBの専用サーバーを想定した一例なので、同じサーバーで WordPress や PHP も動いている場合は、それらの分を差し引いて控えめにしてください。
遅いクエリを見つけるために、log_min_duration_statement で一定時間以上かかったクエリをログに残す設定もしておくと、あとの調整に役立ちます。
バックアップを用意してから使い始める
最後に、データを入れる前にバックアップの手順を決めます。小規模なら、pg_dump で毎日ダンプを取り、別の場所に保存するところから始められます。
sudo -u postgres pg_dump -Fc appdb > /backup/appdb-$(date +%Y%m%d).dump
-Fc は独自形式で、pg_restore で一部のテーブルだけを戻すこともできます。取ったダンプを、別のサーバーやステージング環境で実際に戻せるかも確認しておきます。
まとめ
- OS のパッケージか PGDG のリポジトリから入れ、保守期間が長く残るメジャーバージョンを選ぶ
- Debian 系はクラスタが自動で作られ、RHEL 系は
initdbが必要。文字コードがUTF8かを最初に確認する - アプリ用のロールとデータベースを分け、データベースの所有者をアプリ用ロールにする
- 外部から接続するときは
listen_addressesとpg_hba.confを絞り、scram-sha-256を使う - メモリの初期値を見直し、データを入れる前にバックアップと復元の手順を確かめる