CentOSにPostgreSQLをインストールしてから起動までに必要な最初の設定


掲載日:2020年12月17日



INFOMARTION > CentOSにPostgreSQLをインストールしてから起動までに必要な最初の設定

概要

CentOSにPostgreSQLをインストールしてから起動までに必要な最初の設定の手順です。CentOS7を前提に記載しています。セキュリティに関する部分も記載しているので、参考にしてみてください。

PostgreSQLは無償で利用でき高機能なのでお勧めです。昔はPostgreSQLの関数は処理が遅かったと聞いたことがありますが、最近のものは改善されていて処理速度も速いです。

バージョンは以下となります。

CentOSのバージョン7.6 (1810)
PostgreSQLのバージョン9.2.24

目次

  1. インストール
  2. 設定内容
  3. まとめ

1. インストール

PostgreSQLをインストールする手順について記載します。

1-1. PostgreSQLのインストール

yumコマンドによりPostgreSQLのインストールを実行します。rootユーザで作業を実施してください。

[username@hostname ~]$ su -
[root@hostname ~]# yum -y install postgresql-server

2. 設定内容

PostgreSQLを起動するまでの設定について記載します。

2-1. PostgreSQL専用のユーザを作成する。

PostgreSQLを操作する(psqlコマンドを使える)ための専用ユーザを作成しようと思いましたが、既にユーザが作成されていました。昔作成した時はユーザを作成した記憶があるので、もしかしたら仕様が変わったかもしれません。

以下のコマンドでユーザにスイッチしてみてください。

[root@hostname ~]# su - postgres

もしかしたら古いバージョンのPostgreSQLを使っている人もいるかもしれないので、記載しておきますが、以下の「.bashrc」を変更して環境変数を設定する手順も不要となったようです。

.bashrc


export PGHOME=/var/lib/pgsql
export PGDATA=/var/lib/pgsql/data
export PGHOST=localhost

postgresユーザのデフォルトのPGDATAは「/var/lib/pgsql/data」になったようです。「/usr/lib/systemd/system/postgresql.service」を参照すると記載されています。

2-2. PostgreSQLのデータ作成

PostgreSQLのデータを作成します。エンコーディングはUNICODEとします。デフォルトで「/var/lib/pgsql/data」ディレクトリが作成されていましたが、作成されていない人はフォルダ作成もお願いします。

-bash-4.2$ initdb --encoding=UNICODE

「/usr/lib/systemd/system/postgresql.service」に「PGDATA=/var/lib/pgsql/data」と設定されているため、「initdb --encoding=UNICODE」で「/var/lib/pgsql/data/」配下にDBが構築されます。

2-3. 設定ファイルの修正

PostgreSQLにアクセスできるようにIPアドレスを許可します。ローカル以外のアクセスの場合はパスワード認証されるように設定します。

[root@hostname ~]# vi /var/lib/pgsql/data/postgresql.conf

「postgresql.conf」を以下の通り修正します。

postgresql.conf【変更前】


#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;

postgresql.conf【変更後】


#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'         # what IP address(es) to listen on;

セキュリティに関する重要な部分なので補足すると、この設定を入れると、どのIPからでもアクセスが可能となります。アクセスするIPが固定の場合は、その固定IPを記載してください。

本設定はPostgreSQLをインストールしたサーバ以外からpgadminなどでログインする場合に必要な設定となります。サーバにログインして、psqlコマンドを実行する場合はこの設定は不要です。(接続元が自身(localhost)となるので)

セキュリティに関する重要な設定なので、アクセスできるユーザは極力最小限にしましょう。

続いて「pg_hba.conf」を修正します。

[root@hostname ~]# vi /var/lib/pgsql/data/pg_hba.conf

以下の内容を末尾に追加してください。

pg_hba.conf


#外からはパスワード認証
host    all             all             0.0.0.0/0            md5

この設定を入れることで、外部から接続する時はパスワードが要求されます。ここら辺は設定しなかったり、設定が誤っていると重大なセキュリティホールになるので最新の注意を払って設定してください。

2-4. 起動確認

事前設定は完了したので、PostgreSQLが起動するか確認します。postgresユーザでDBを構築したので、postgresユーザにスイッチをしてから起動します。

[root@hostname ~]# su - postgres
-bash-4.2$ pg_ctl start

無事にPostgreSQLが起動したらpsqlコマンドが問題なく動くか確認しましょう。postgresユーザでpsqlコマンドを実行してください。

-bash-4.2$ psql -l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)

上記の様な結果が返ってくればOKです。

2-5. 自動起動設定

必須ではありませんが、毎回サーバ再起動の度に起動するのは大変なので、サーバ起動時にPostgreSQLが自動起動するように設定を入れます。systemctlコマンドへの登録も行います。CentOS7の場合の手順なので、CentOS7以外を使用している方はServiceコマンドにより対応する必要があるので、ご注意ください。

「/usr/lib/systemd/system/postgresql.service」が存在するか確認します。無い場合は、以下の手順で「postgresql.service」を作成します。rootユーザで実行します。

[root@hostname ~]# touch /etc/systemd/system/postgresql.service
[root@hostname ~]# vi /etc/systemd/system/postgresql.service

以下の内容を記載します。

postgresql.service


[Unit]
#説明
Description=PostgreSQL
#実行前、実行後を制御
#Before=xxx.service
After=network.target

[Service]
#ユーザ、グループ指定
User=postgres
Group=postgres
#起動したらステータスを起動中にする
Type=oneshot
RemainAfterExit=yes
#起動、停止、リロード
Environment=PGDATA=/var/lib/pgsql/data
ExecStart=/usr/bin/pg_ctl start -D /var/lib/pgsql/data
ExecStop=/usr/bin/pg_ctl stop
ExecReload=/usr/bin/pg_ctl reload

[Install]
#runlevel3相当の設定
WantedBy=multi-user.target

次にsystemctlコマンドに登録します。

[root@hostname ~]# systemctl enable postgresql
[root@hostname ~]# systemctl is-enabled postgresql
enabled
[root@hostname ~]# systemctl list-unit-files --type=service | grep postgresql
postgresql.service                                enabled
[root@hostname ~]# systemctl daemon-reload

2-6. PostgreSQLに管理ユーザを追加する

LinuxからPostgreSQLを操作するユーザとは別にPostgreSQLのアプリ内で使用するユーザを作成します。pgadminなどで操作する時のユーザはこちらのユーザになります。デフォルトで存在するpostgresユーザのパスワード変更して使用したいと思います。

postgresユーザで以下のコマンドを実行します。

-bash-4.2$ psql
postgres=# alter role postgres with password 'パスワード';
postgres=# \q

※「パスワード」には設定するパスワードを入力してください。

2-7. firewallの穴あけ作業

CentOS7のデフォルト値ではfirewall(CentOS6以前の場合はiptables) がsshしかアクセスを許可していないのでPostgreSQLのポートをアクセス許可します。設定を永続的にするために「permanent」オプションも追加します。

[root@hostname ~]# firewall-cmd --permanent --zone=public --add-port=5432/tcp
[root@hostname ~]# firewall-cmd --reload
[root@hostname ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 8080/tcp 5432/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

「ports: 5432/tcp」となったらOKです。

pgadminでアクセスしてみます。postgresユーザで、先程設定したパスワードでログインが可能なはずです。

3. まとめ

PostgreSQLをインストールした時に必要な最初の設定について記載させていただきました。PostgreSQLの初期構築は苦戦することもあるので、参考にしてみてください。

最後までご覧いただきありがとうございました。



■INFORMATION

INFORMATIONのトップページはこちらよりお願いいたします。


■PROFILE

プロフィールはこちらよりお願いいたします。


■お問い合わせ先

記事に関するお問い合わせはこちらよりお願いいたします。