JSPで行こう!

PostgreSQLの設定

 PostgreSQL のインストール後の設定です。
やり方はいろいろあるので一例になります。

  1. JDK のインストール
  2. Tomcat のインストール
  3. Apache のインストール
  4. PostgreSQL のインストール
  5. アプリケーションの設定

データベースの作成

initdb 直後の状態を確認します。

# su - postgres
$ psql

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

postgres=#

既に3つのデータベースがありますが、それぞれ役割があるのでこれらはさわらずに新しいデータベースを作成します。
ここでは psql コマンド内で create database 文を実行して作成します。
例として tesatdb という名前で作成しています。

postgres=# create database testdb
postgres-# \g
CREATE DATABASE
postgres=# \l
  :
 testdb    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |

文字コード(Encoding)は UTF8 で良いでしょう。Collation と Ctype は好みですが、ソートした際の並び順が変わります。
"C" を使うと単純なコード順になります。
作成後の変更は出来ないので一度削除後、再作成します。

drop database testdb
create database testdb lc_collate 'C' lc_ctype 'C' template template0

接続方法の設定

 状況を整理しておきます。
yum のインストールではデフォルトで "postgres" という CentOS ユーザーが作成されています。
PostgreSQL のサービスはこのユーザーで動きます。

initdb を実行してデータベースのテンプレートが作成されますが、その際 PostgreSQL 上のスーパーユーザー(管理者)が決まります。
デフォルトでは、initdb を実行したOS ユーザー名になります。(つまり "postgres")。
変える事もできますが、特に推奨はされていません。
"postgres" ユーザーでデータベース(ここでは"testdb")を作成しました。

わざわざ整理したのは、OS 上も PostgreSQL 上も同じ "postgres"というユーザー名で行われていたという点です。
例えば、Tomcat(jdbc)から接続しようとした際、Tomcat は "tomcat" という OSユーザーで動いています。
接続するには、ユーザー名とパスワードが必要です。

POstgreSQL の運用上考え方は2通りあります。

万が一、間違ってテーブルを DROP したりしないように権限を制限する場合はユーザーを作りましょう。
管理者と開発者が同じであれば、特に別のユーザーを作成して分ける必要はなさそうです。

Postgres ユーザーで jdbc からの接続しようとすると現状では情報不足です。
データベース上の "postgres" にパスワードを設定して、それを使って接続します。

# su - postgres
$ psql
postgres=# alter role postgres with password 'パスワード';

同一サーバー上での jdbc の接続ならこれだけで良いのです。
仮に、別のホストから接続する場合は以下の設定が必要です。

data/pg_hba.conf

デフォルトの設定は以下になっています。

# 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            scram-sha-256

local と host の違いですが、ファイルのコメント通り local は UNIXドメインソケットで
host は TCP/IPソケットを使う場合の設定です。
何が違うのかと言えば、psql でパスワードの設定なしで接続できていたのは UNIXドメインソケット で行われているからです。
この時、peer ではパスワードはチェックされません。

jdbc で "postgres" にデータベースのパスワードを設定しないと接続できないのは TCP/IPソケットを使う為です。
仮に、リモートから接続するには host の IPアドレスのマスク設定を広げれば良い訳です。
例えば、どこからでも接続を許すなら次を設定します。
(さらに、data/postgresql.conf で LISTEN を "localhost" から "*" にする必要もあります)

0.0.0.0/0

TCP/IP 接続は scram-sha-256 によりパスワードをチェックして接続できます。
(古いバージョンでは、scram-sha-256 ではなく ident や md5 が設定されている場合もあります)

Windowsではそもそも UNIXドメインソケットは使えません。(最近サポートされたようですがまだ浸透してません)
ですので、そもそもパスワードを指定しないと使えません。

trust と peer、ident の違い?

ネットを検索すると、上記の設定の混在がいろいろ散見されます。
これらは、接続元のクライアントのホストの認証を信頼する、つまりユーザー名だけ一致していれば、
パスワードは不要という意味で挙動が似ています。

違いですが、まず peer が host(TCP/IPソケット) では指定できません。
ident は、hsot(TCP/IPソケット)のみで有効です。
ident を local で指定すると、peer が使われます。(マニュアル記載通り)
peer と ident は OS にユーザーの存在を確認しますが、trust は OSのユーザーの存在をチェックしません。
ですので、trust はテストで使うには良いですが運用ではなるべく使わないほうが無難です。

なお、ident は identサービスが動いている前提ですが、Linux を含め、今時デフォルトで動いている環境は
皆無でしょうから機能せず、通常のパスワード認証が働いているようです。

IPv6 の設定?

IPv6 を使っていない場合は本来関係無いと思います。
PostgreSQL 15 では問題ありませんが、9.6 だと次のようなエラーが出る場合がありました。

「FATAL:  pg_hba.conf にホスト"::1"、ユーザ"postgres"、データベース"xxxx, SSL無効用のエントリがありません」
"::1" は IPv6 の設定ですから、何らかのチェックが入っています。

# IPv6 local connections:
# host    all             all             ::1/128                 ident
host    all             all             ::1/128                 trust

と trust を指定すれば無視してくれます。
ただし IPv4 も trust になってしまい、本来想定される挙動では無いです。
PostgreSQL 15 では必要無かったので、一時的なバージョンの問題だったと思います。


« 前頁 次頁 »