vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

CentOS7にPostgreSQLを導入&初期設定をおこなう

      2017/01/31

LINEで送る
Pocket

centos7-postgres
こんにちは、okutani(@okutani_t)です。本記事ではCentOS7にPostgreSQL(9.5)を導入する手順を紹介しています。

今回導入したCentOS7のバージョンは次のとおりです。

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

では、さっそくCentOS7にPostgreSQLを導入してみましょう。

スポンサーリンク

CentOS7にPostgreSQLを導入する

まずはPostgreSQLが導入されているか確認します。

$ rpm -qa | grep postgres

もしPostgreSQLが存在していたら、次のコマンドで削除しておきます。

$ sudo yum -y remove postgresql

最新のPostgreSQLを導入するため、下記公式サイトから最新版のPostgreSQLのリポジトリURLを取得。今回はPostgreSQL9.5を選択しました。

LINKPostgreSQL RPM Repository (with Yum)

centos7-postgres2

次のURLが取得できました。

https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm

次のコマンドでリポジトリを追加します。

$ sudo rpm -iUvh https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm

明示的にPostgreSQLのリポジトリを利用したいため、「/etc/yum.repos.d/pgdg-95-centos.repo」の下記行を次のように変更します。

$ sudo vi /etc/yum.repos.d/pgdg-95-centos.repo
[pgdg95]
...省略...
enabled=1
↓
enabled=0

pgdg-95-centos.repoファイルは次のようになりました。

[pgdg95]
name=PostgreSQL 9.5 $releasever - $basearch
baseurl=https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG-95

[pgdg95-source]
name=PostgreSQL 9.5 $releasever - $basearch - Source
failovermethod=priority
baseurl=https://download.postgresql.org/pub/repos/yum/srpms/9.5/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG-95

では、次のコマンドでPostgreSQLを導入しましょう。

$ sudo yum -y install --enablerepo=pgdg95 postgresql95-server postgresql95-devel postgresql95-contrib

導入を確認します。

$ psql --version
psql (PostgreSQL) 9.5.2

これでPostgreSQL9.5が導入されました。

PostgreSQLを起動してみる

まずはPostgreSQLのデータベースを初期化します。次のコマンドでPostgreSQLのデータベースクラスタを作成。

$ sudo /usr/pgsql-9.5/bin/postgresql95-setup initdb

もし、何かしらの理由でinitdbをやり直したい場合は「cd /var/lib/pgsql」したあとに中身をすべてrmで削除すればOKです。

PostgreSQLを実行。

$ sudo systemctl start postgresql-9.5

停止する場合は次のコマンドです。

$ sudo systemctl stop postgresql-9.5

再起動は以下。

$ sudo systemctl reload postgresql-9.5

次のコマンドで、OS起動時に自動でPostgreSQLが起動するように設定できます。

$ sudo systemctl enable postgresql-9.5

自動起動を停止する場合は以下。

$ sudo systemctl disable postgresql-9.5

起動・自動起動の有無は次のコマンドで調べることができます。

$ sudo systemctl status postgresql-9.5
もしくは
$ systemctl is-enabled postgresql-9.5

これでPostgreSQLが使えるようになりました。

PostgreSQLの初期設定

外部サーバーからのアクセスを許可するには「/var/lib/pgsql/9.5/data/postgresql.conf」を次のように編集することで設定。デフォルトではローカル(127.0.0.1)のみ許可されています。お好みで設定してください。

$ sudo vi /var/lib/pgsql/9.5/data/postgresql.conf
# 59行目あたり
#listen_addresses = 'localhost'
↓
listen_addresses = '*'

ポート番号をデフォルトの5432から変えたい場合は、次の行を適宜変更してください。ポート番号を変更しない場合も、#は取り除いておきましょう。

# 63行目あたり
#port 5432
↓
port xxxx

もし、ログの形式を変更したい場合は下記行を適宜変更してください。次の例は「日時 ユーザー DB」の形式で設定。

# 419行目あたり
log_line_prefix = '< %m >'
↓
log_line_prefix = '< %t %u %d >'

次はクライアントの認証設定をおこないます。「pg_hba.conf」を適宜設定していきます。

$ sudo vi /var/lib/pgsql/9.5/data/pg_hba.conf

一応、デフォルトのpg_hba.confを載せておきます。

# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# Refer to the "Client Authentication" section in the PostgreSQL
# documentation for a complete description of this file.  A short
# synopsis follows.
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access.  Records take one of these forms:
#
# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
#
# (The uppercase items must be replaced by actual values.)
#
# The first field is the connection type: "local" is a Unix-domain
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
# plain TCP/IP socket.
#
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, or a comma-separated list thereof. The "all"
# keyword does not match "replication". Access to replication
# must be enabled in a separate record (see example below).
#
# USER can be "all", a user name, a group name prefixed with "+", or a
# comma-separated list thereof.  In both the DATABASE and USER fields
# you can also write a file name prefixed with "@" to include names
# from a separate file.
#
# ADDRESS specifies the set of hosts the record matches.  It can be a
# host name, or it is made up of an IP address and a CIDR mask that is
# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that
# specifies the number of significant bits in the mask.  A host name
# that starts with a dot (.) matches a suffix of the actual host name.
# Alternatively, you can write an IP address and netmask in separate
# columns to specify the set of hosts.  Instead of a CIDR-address, you
# can write "samehost" to match any of the server's own IP addresses,
# or "samenet" to match any address in any subnet that the server is
# directly connected to.
#
# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.
#
# OPTIONS are a set of options for the authentication in the format
# NAME=VALUE.  The available options depend on the different
# authentication methods -- refer to the "Client Authentication"
# section in the documentation for a list of which options are
# available for which authentication methods.
#
# Database and user names containing spaces, commas, quotes and other
# special characters must be quoted.  Quoting one of the keywords
# "all", "sameuser", "samerole" or "replication" makes the name lose
# its special character, and just match a database or username with
# that name.
#
# This file is read on server startup and when the postmaster receives
# a SIGHUP signal.  If you edit the file on a running system, you have
# to SIGHUP the postmaster for the changes to take effect.  You can
# use "pg_ctl reload" to do that.



# Put your actual configuration here
# ----------------------------------
#
# If you want to allow non-local connections, you need to add more
# "host" records.  In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident

特定のIPのみ、外部接続を無条件に許可(パスワード無しに)するには、pg_hba.confの以下の箇所を次のように変更します。

...省略...
# 79行目あたり
# "local" is for Unix domain socket connections only
local all all   peer
# ↓追記
host all all 接続許可するIPアドレス/32 trust

...省略...

これで指定したIPアドレスからだけ外部接続できるようになりました。

なお、接続するIPアドレスはCIDR表記(/付き)にします。詳しくは「could not load pg_hba.conf でハマった – Qiita」を参考にしてください。

ph_hba.confでの認証設定は、上から順番に読み込まれ、先に読まれたほうが優先されます。もし、うまくいかない場合は記述場所を見なおしてみましょう。

また、開発用途として、すべてのアクセスを許可する場合は次のようにします(本番環境では絶対に設定しないでください)。

host all all 0.0.0.0/0 trust

設定ファイルを反映させるため、再起動します。

$ sudo systemctl restart postgresql-9.5

ph_hba.confの設定は今回必要最低限の項目しか解説しませんが、左から「TYPE」「DATABASE」「USER」「ADDRESS」「METHOD」です。ここでは「よく使う項目のみ」説明します。

  • TYPE(接続方式)
  • local: Unixドメインソケットで接続した場合。
    host: TCP/IPで接続した場合。

  • DATABASE(接続データベース)
  • データベース名を入力。もしくは「all」で全データベースを指定

  • USER(接続ユーザー)
  • 接続ユーザー名を入力。もしくは「all」で全ユーザーを指定

  • ADDRESS(接続元のIPアドレス)
  • 接続元のIPアドレスを入力。「localhost」などのホスト名、「0.0.0.0/0(IPv4)」「::/0(iPv6)」などのIPアドレス(例はそれぞれすべてのIPを表す記述)が利用可能

  • METHOD(認証方式と認証オプション)
  • trust: すべての接続を無条件で許可
    reject: すべての接続を拒否
    md5: md5暗号化によるパスワード認証
    password: 平文によるパスワード認証
    ident: UNIXで設定されている現在のユーザー名(identサーバから取得)と、PostgreSQLのユーザー名が一致した場合認証(TCP/IP接続のみ)
    peer: UNIXで設定されている現在のユーザー名(OSから取得)と、PostgreSQLのユーザー名が一致した場合認証(ローカル接続のみ)

上記に載っていない項目も複数あるため、詳しくは「pg_hba.conf 設定項目」などでぐぐってみてください。

設定方法の一例として、79行目以降を次のように設定してみました。

local    all    postgres                     trust
host    all    postgres    localhost    trust
host    all    all              all               md5

これは「localhost上のpostgresユーザーとリモートの特定のIPアドレスからの接続はすべて許可、それ以外はmd5暗号化の認証をおこなう」といったものです。参考にしてください。

PostgreSQLに接続してみる

試しにPostgreSQLのデータベースに接続してみましょう。

PostgreSQLを導入すると、CentOS上に「postgres」ユーザーが自動で追加されます。また、データベース「postgres」、データベース接続ユーザー「postgres」も自動で作成されます。

今回はこれらの情報を確認しながら接続してみましょう。

まずは次のコマンドでCentOS上のpostgresユーザーのパスワードを設定しましょう。

$ sudo passwd postgres
Changing password for user postgres.
New password: [パスワード入力]
Retype new password: [パスワード入力]
passwd: all authentication tokens updated successfully.

パスワードが設定されました。

次のコマンドでpostgresユーザーに変更します。今設定したパスワードでログインしましょう。

$ su - postgres

データベースの一覧を表示させてみましょう。

-bash-4.2$ psql -l

次のコマンドでPostgreSQLのシェルにログイン。postgresという名前のDBにアクセスできます。

-bash-4.2$ psql

DBを指定して接続したい場合は以下のとおりです。

-bash-4.2$ psql -d postgres

接続すると、下記のように「postgres=#」という形になり、PostgreSQLのシェルにログインします。

PostgreSQLユーザーのパスワードを設定しましょう。次のコマンドを入力。

postgres=# alter role postgres password '新規パスワード';
ALTER ROLE

これでパスワードが設定されました。

PostgreSQLのシェルを抜けて終了するには以下のコマンド。

postgres=# \q

新しくPostgreSQL上のユーザーを追加する場合は以下のとおりです。パスワードを聞かれるので適宜設定します。また、CentOS7上のユーザー名と一致するように設定すると管理が楽です。

-bash-4.2$ createuser -P ユーザー名
Enter password for new role: [パスワード入力]
Enter it again: [パスワード再入力]

もしくは次のコマンドを使うと、スーパーユーザーで作成することができます。スーパーユーザーはデータベースの作成や権限の管理などができます。

-bash-4.2$ createuser --superuser -P ユーザー名

次のコマンドでユーザーの一覧を確認することができます。

-bash-4.2$ psql
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 okutani   |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

データベースの作成は以下。

postgres=# create database データベース名;
CREATE DATABASE

hogeという名前で適当に作ってみました。次のコマンドでデータベースの一覧を確認。

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 hoge      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

作成したユーザーで、データベースを作成する場合は以下のとおりです。

postgres=# create database データベース名 owner ユーザー名;

データベースを削除する場合は以下。

postgres=# drop database データベース名;

これでCentOS7でPostgreSQLが利用できますね。

まとめ

CentOS7にPostgreSQLを導入する手順を紹介しました。

本記事では基本的な部分のみおさえましたが、pg_hba.confなどは本記事で紹介していない設定項目がたくさんあるので、興味がある方は調べてみてください。

PostgreSQLの設定については以下の書籍が参考になりました。

PostgreSQLを利用する際の参考になれば幸いです。

LINEで送る
Pocket

okutani (okutani_t) のヒトコト
データベース周りって設定がややこしくて難しいですね。これで一通り使えるようになったので、いろいろとデータを入れて試してみます。

Web開発のお仕事を募集しています

フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。

Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。

ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。

LINKお問い合わせ

LINKokutani's Portfolio


 - PostgreSQL

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。