PostgreSQLは、最新で用途の広いRDBMSですが、アプリケーションの開発を検討しているときにセットアップして実行するのが最も簡単な方法ではありません。LTSバージョンのPostgreSQLで最新バージョンのPostgreSQLを開始する方法については、以下をお読みください。 Ubuntu。
Ubuntu18.04にはPostgreSQL10が付属していますが、代わりにPostgreSQLチームがホストするAPTリポジトリを使用して、最新バージョンのPostgreSQL11をインストールできます。
次のコマンドを使用してリポジトリを設定できます:
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
次に、以下を使用してソフトウェア自体をインストールします。
sudo apt-get install postgresql-11
インストールはいくつかのことを行います:
- PostgreSQLサーバー、ユーティリティ、および psqlと呼ばれるコマンドラインクライアントをインストールします 。
- postgresというLinuxシステムユーザーを作成します 。すべてのデータファイルはこのユーザーが所有し、すべてのプロセスはこのユーザーとして実行されます。
- postgresとも呼ばれる1つのデータベースを作成します 。
- 1人のPostgreSQLユーザーを作成します( Linuxシステムユーザー)、 postgresとも呼ばれます 。
これが混乱し始めていることがわかります!
新しくインストールされたPostgreSQLサーバーは、「データベースクラスター」と呼ばれるものを管理する一連のプロセスで構成されています。ここでプロセスを見ることができます:
alice@devbox:~$ ps axfww | grep postgres
4737 ? S 0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
4749 ? Ss 0:00 \_ postgres: 11/main: checkpointer
4750 ? Ss 0:00 \_ postgres: 11/main: background writer
4751 ? Ss 0:00 \_ postgres: 11/main: walwriter
4752 ? Ss 0:00 \_ postgres: 11/main: autovacuum launcher
4753 ? Ss 0:00 \_ postgres: 11/main: stats collector
4754 ? Ss 0:00 \_ postgres: 11/main: logical replication launcher
メインプロセス(ここではPID 4737を使用)は、子プロセスをさらに生成するメインプロセスです。これは、従来、「ポストマスター」プロセスと呼ばれていました。
PostgreSQLでの「クラスター」という用語の使用は、現代の派手な分散クラスタリングの専門用語よりも前のものです。ここでは、単一のポストマスターによって単一のマシンで管理されているデータベースのセットを意味します。クラスターの詳細については、こちらをご覧ください。
クラスタには、データベース(今のところ「postgres」は1つだけ)とPostgreSQLユーザー(今のところ「postgres」とも呼ばれます)が含まれています。ご存知のとおり、クラスターは多数のデータファイルに関連付けられており、そのすべてが1つのディレクトリ(この場合は / var / lib / postgresql / 11 / main )の下にあります。 。上記のpostmasterコマンドラインでこのパスに気づきましたか?
アプリまたはpsqlがPostgresに接続する場合、PostgreSQLユーザーのコンテキストで接続する必要があります。 常にあります 接続に関連付けられているPostgreSQLユーザー。ただし、ご想像のとおり、PostgreSQLユーザーはシステムユーザーに対応する場合と対応しない場合があります。
PostgreSQLユーザーは、CREATEROLEなどのSQLコマンドまたはcreatedbなどのバンドルツールを使用して作成できます。
アプリケーションがPostgresに接続しようとするときは、PostgreSQLユーザー名を指定する必要があります。 psqlのようなPostgreSQLクライアントを起動するとどうなるか見てみましょう:
alice@devbox:~$ psql
psql: FATAL: role "alice" does not exist
ここで、「alice」はLinuxシステムのユーザー名です。 psqlはこの名前を取り、それをPostgresユーザー名として使用します。その名前の役割(役割は「ユーザー」または「グループ」の一種の総称ですが、ところで)は存在しません。これは、Postgresが不満を言っていることです。
「postgres」という名前の役割があることはわかっているので、それを試してみましょう。ユーザー名を指定するためにpsqlの「-U」パラメーターを使用できます:
alice@devbox:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
OK、近づいています。ロール/ユーザーの「postgres」は存在しますが、「peerauthentication」は失敗しました。この「ピア認証」とは何ですか?
psqlやアプリなどのPostgreSQLクライアントは、次のIPCメカニズムのいずれかを介してPostgreSQLサーバーに接続できます。
- Unixドメインソケット
- TCPソケット
TCPソケットとは異なり、Unixドメインソケットはクライアント接続のシステムユーザーIDを検証する可能性を提供します。 Postgresサーバーは、Unixドメインソケットを介した着信接続を調べて、クライアントのシステムユーザーIDを判別し、アクセスを許可するかどうかを決定できます。
デフォルトでは、サーバーはUNIXドメインソケットを介した接続のみをリッスンし、TCP/IPはリッスンしません。
システムユーザーとしてpsqlを起動しようとするとどうなるか見てみましょう。 postgres:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=#
それはうまくいきました! (「\ q」、「\ quit」、または^D
を使用します ところで、psqlを終了します。)
ピア認証では、クライアント接続がUnixドメインソケットを使用して行われ、クライアントプロセスが接続しようとしているPostgreSQLユーザーと同じシステムユーザー名を持っている場合、認証は成功したと見なされます。
PostgreSQLユーザーにはオプションでパスワードを割り当てることもでき、パスワードを使用して着信接続を検証するようPostgreSQLに依頼できます。しかし、どのように?それがパズルの次のピースです。
pg_hba.conf
次に、/etc/postgresql/11/main/pg_hba.conf
にある(悪名高い)pg_hba.conf構成ファイルを開きます。 :
sudo vim /etc/postgresql/11/main/pg_hba.conf
HBAは、ホストベースの認証の略です。基本的に、このファイルはPostgreSQLユーザーの認証方法を制御するために使用されます。このファイルは、おそらくPostgreSQLの学習曲線の中で最も直感的でない部分です。リファレンスドキュメントはここにあります。後で読む必要があります。
ここでの最初の(コメントではない)行は次のとおりです:
local all postgres peer
これは、Postgresに「すべての」データベースへの「ローカル」(unixドメイン)接続を受け入れ、「ピア」認証を使用してユーザー「postgres」として認証するように指示します。これが、システムユーザー「postgres」として接続することがすぐに機能する理由です。
このファイルの行の順序は重要であり、最初に一致する行が優先されます。別の行を見てみましょう:
host all all 127.0.0.1/32 md5
この行により、「すべての」ユーザーは、「md5」方式を使用したパスワード認証に成功した場合、ローカルホスト(「127.0.0.1/32」)から「すべての」データベースにTCP / IP(「ホスト」)を使用してログインできます。
パスワード認証方法(md5、scram-sha-256、gss、ldapなど)は、説明できる範囲を超えているため、簡単な例に戻りましょう。
ただし、最初に、PostgreSQLがTCP / IP接続も受け入れていることを確認する必要があります。そのためには、メインの構成ファイルを編集する必要があります。
postgresql.conf
ファイル/etc/postgresql/11/main/postgresql.conf PostgreSQLクラスターのメイン構成ファイルです。このファイルにはロットが含まれています 設定の、そしてそれらのすべてが何を意味するのかを理解することはまったく簡単な作業ではありません。とりあえず、最初の設定を見てみましょう:
#listen_addresses = 'localhost'
この行はデフォルトでコメント化されています。コメントを外して読み上げましょう:
listen_addresses = 'localhost'
これにより、PostgreSQLはローカルホストのポート5432(デフォルト)で着信TCP/IP接続をリッスンできます。変更を保存し(これを行うには「root」である必要があります)、変更を有効にするためにPostgresサーバーを再起動します。
sudo systemctl restart postgresql
(ほとんどの設定変更では、「再起動」ではなく「再読み込み」する必要があることに注意してください。ただし、これには「再起動」が必要です。
これで、Postgresが127.0.0.1にバインドされたポート5432でリッスンしていることがわかります:
alice@devbox:~$ sudo netstat -tnlp | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 8408/postgres
それでは、アプリで使用する新しいユーザーとデータベースを設定しましょう。
スーパーユーザー「postgres」として接続して変更を加えましょう:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=# create user myapp_user password 's3cr3t';
CREATE ROLE
postgres=# create database myapp owner myapp_user;
CREATE DATABASE
postgres=#
これで、myapp
というデータベースが作成されました。 およびmyapp_user
というユーザー 、パスワードs3cr3t
を使用 。データベースは空であり、ユーザーmyapp_user
が所有します。 、これは、myapp_user
として接続することを意味します クライアントは、ほとんどすべてのDDL/DMLコマンドを実行できるようになります。
今すぐこのアプリユーザーとしてアプリデータベースに接続しましょう:
alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
Password for user myapp_user:
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
myapp=>
機能した!これで、127.0.0.1へのSSL over aTCP / IP接続を使用して、「myapp」に接続されました(プロンプトを参照)。 psqlのコマンドラインでもデータベース名を指定したことに注意してください。歴史的な理由から、これを省略した場合、データベース名もシステムユーザー名(ここでは「alice」)と同じであると見なされますが、これは私たちが望んでいるものではありません。 PostgreSQLのユーザー名も指定されています(「-Umyapp_user」)。
他のマシンから接続する必要がある場合は、pg_hba.conf
を編集する必要があります そのような行を追加するには:
# existing entry, allows connections from localhost
host all all 127.0.0.1/32 md5
# new entry to allow connections from 10.1.2.0/24 subnet,
# only to myapp database for myapp_user
host myapp myapp_user 10.1.2.0/24 md5
変更を有効にするには、PostgreSQLをリロードします(「sudosystemctl reloadpostgresql」)。
これにより、アプリで次のようなデータベース接続文字列を使用できるようになります。
# URL format
postgresql://myapp_user:[email protected]/myapp
# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
これにより、アプリ専用のデータベースとユーザーをセットアップできるようになります。アプリ開発フレームワーク(Django、Drupalなど)は、オブジェクト(テーブル、ビューなど)を作成し、このデータベースのデータを管理できる必要があります。