読者です 読者をやめる 読者になる 読者になる

PostgreSQL&phpPgAdmin最速インストールマニュアル

phpPgAdminは管理用ツールなので必ずしも必要ないのですが、
いざ導入しようとするとアクセス権限の設定にちょっと癖があり、

  • ローカルではログインできるのにリモートからログインできない
  • リモートのターミナルからはログインできるのにphpPgAdminのWebインターフェースからログイン出来ない。
  • そもそもPostgreSQLにログインする方法ができない。わからない。
  • 仕事がちっっとも進まない。


といったトラブルが世界各国から多数報告されています。

そこで、いつでもピカピカのデータベース環境を迅速に構築するため、自分がハマったポイントを中心に詳細に手順をまとめてみました。
使用したOSはScientificLinux 6.0 64bitです(RHEL6.0クローン)。

これらのことさえ把握していれば、これからは一発でphpPgAdminが起動するようになるはずです。多分。

OSをインストール

もちろんMinimumで。

最低限の設定

  • スーパーユーザーrootがsshでリモートログイン出来ない様にします
$> vi /etc/ssh/sshd_config

>> PermitRootLogin no

$> /etc/rc.d/init.d/sshd restart
  • 一般管理者ユーザーの追加
$> adduser (一般管理者ユーザー名)
$> passwd (一般管理者ユーザー名)
  • 一般管理者ユーザーにsudoでrootと同じ権限を与える
$> visudo

>> ## Allow root to run any commands anywhere
>> root    ALL=(ALL)       ALL
>> (一般管理者ユーザー名)   ALL=(ALL)       ALL
  • 無用のトラブルを招くサービスの停止
    • SELinuxの無効化
$> vi /etc/sysconfig/selinux

>> SELINUX=disabled

きちんと設定すれば言うことを聞くいい子らしいですけど停止。

    • ip6tablesの停止
$> /etc/rc.d/init.d/ip6tables stop
$> /sbin/sysconfig/ip6tables off

あとで書く。停止。
ここで一旦rebootします。ここからはリモートで操作可能です。

必要なパッケージのインストール

$  yum install yum-plugin-fastestmirror rpmforge
$> yum install epel-release 
$> yum install php httpd postgresql postgresql-server
$> yum install phpPgAdmin

phpPgAdminのみepelリポジトリにあります。epelいい子。
追記)fastestmirror, rpmforgeは任意。fastestmirrorはslのリポジトリが時に大変遅い時があるので入れておいたほうが無難です。rpmforgeもあると役に立ちます。

Webサーバの設定&起動

httpdの起動時にホスト名を設定しろとwarningが出るからそれだけ変更しておきます。

$> vi /etc/httpd/conf/httpd.conf

>> ServerName (好きなホスト名)

$> /etc/rc.d/init.d/httpd start
$> /sbin/chkconfig httpd on

phpPgAdminの現状を確認

ここでphpPgAdminがどういう状態になっているか確認しておきましょう。
http://(サーバのIP)/phpPgAdmin というアドレスでアクセスできるようになっているはずです。
初回インストール時にはForbiddenになってしまいますが正しい挙動です。
httpdがローカルからのアクセスしか許可していないからです。

phpPgAdminをリモートからアクセスすることを可能にする

$> vi /etc/httpd/conf.d/phpPgAdmin.conf

>> Allow from 127.0.0.1 (許可したいIPをスペース区切りで追加)

$> /etc/rc.d/init.d/httpd restart

http://(サーバのIP)/phpPgAdmin にアクセスするとphpPgAdminのトップページが表示されるようになっているはずです。
この時点ではPostgreSQLのデータは一切存在しないのでいくらやってもログインできません

phpPgAdminの設定

phpPgAdmin経由でリモートからTCP/IP接続でPostgreSQLのDBをアクセスできる設定を行います。

$> vi /etc/phpPgAdmin/config.inc.php

>> $conf['servers'][0]['host'] = 'localhost';
>> $conf['servers'][0]['port'] = 5432;
>> $conf['extra_login_security'] = false;
>> $conf['owned_only'] = false;

extra_login_securityについてはパスワードなしのログインやpostgresユーザーによるログインを許可したくなかったらtrueのままのほうが良いでしょう。
無用のトラブルを避けるため取り敢えずfalseで(後でtrueにしておく)。

PostgreSQLの現状を確認

特に指定がない場合DBのデータは以下の場所にあります(dataディレクトリ以下)。

$> ls -al /var/lib/pgsql/
drwx------.  4 postgres postgres 4096 10月 20 10:44 2011 .
-rw-r--r--.  1 postgres postgres   85 10月 18 07:15 2011 .bash_profile
drwx------.  2 postgres postgres 4096 10月 18 07:15 2011 backups
drwx------.  2 postgres postgres 4096 10月 18 07:15 2011 data

$> ls -al /var/lib/pgsql/data
drwx------. 2 postgres postgres 4096 10月 18 07:15 2011 . 
drwx------. 4 postgres postgres 4096 10月 20 10:44 2011 ..

初期状態では空っぽです。
data以下に何か入っていたらrm -rfして消しておきましょう。
dataフォルダ毎消さないように要注意です。もし消してしまったら、

$> mkdir data
$> chown postgres:postgres data
$> chmod 700 data

で作成しておきましょう。

PostgreSQLの管理者ユーザーpostgresのLinuxパスワードを設定

Linuxユーザーのpostgresのパスワードを自分で管理できるものに変更しておきます。

$> passwd postgres

システムのロケール設定を確認する

必ずしも必要ないのですが、さくらのVPSで痛い目にあったので念のため。

$> vi /etc/sysconfig/i18n

>> LANG="ja_JP.UTF-8"

PostgreSQLのデータファイルを作成する

PostgreSQLのコマンドinitdbを使います(postgresのみ実行可)。
文字コードはUTF8、ロケール設定なし でのDBファイルを作成します。※重要:後から変更できない
他の設定はinitdbのヘルプを参照してください。

$> su - postgres ※ ユーザーpostgresのシェルに変わる
postgres$> initdb --encoding=UTF8 --no-locale

PostgreSQLの設定(その1)

PostgreSQLの管理者postgresのDBログイン時のパスワードを設定します。

とりあえずPostgreSQLにログインできるようにする(暫定処置)
$> vi /var/lib/pgsql/data/pg_hba.conf

>> # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
>> local   all         all                               trust

$> /etc/rc.d/init.d/postgresql start

ローカルからの接続は無条件に許可しているのでパスワードは何も聞かれずにpsqlシェルに入れるようになるはずです。

DBユーザーとしてのpostgresのパスワードを変更

psqlシェルに入りpostgresユーザーにDBのパスワードを設定します。

$> su - postgres ※ここで聞かれるパスワードはLinuxのパスワード
$> psql 
psql> alter user postgres with password '*****'; ※PostgreSQLのDBパスワードを設定する
ALTER ROLE

PostgreSQLの設定(その2)

TCP/IPでリモートアクセスできるように設定します。
すべてパスワード認証を行うように設定します。

$> vi /var/lib/pgsql/data/postgresql.conf

>> listen_addresses = '*' ※コメントアウトを外す。localhost => * に変更する。
>> port = 5432 ※同上

$> vi /var/lib/pgsql/data/pg_hba.conf

>> # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
>> local   all         all                               md5
>> host    all         all         127.0.0.1/32          md5
>> host    all         all         (追加したいIPアドレス/サブネットマスク)         md5

$> /etc/rc.d/init.d/postgresql restart ※再起動
  • phpPgAdminの画面からパスワード認証でログインして操作する必要があるためMETHODはすべてmd5
  • localhost(127.0.0.1)に加え、許可したいIPアドレスとサブネットマスク値を設定する
  • 固定グローバルIPに許可を与えるのなら"220.14.112.23/0"のようになる

iptablesにポート番号5432のアクセス許可を与える

$> vi /etc/sysconfig/iptables

>> -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
>> -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
>> -A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT ※追加

$> /etc/rc.d/init.d/iptables restart ※再起動

PostgreSQL:リモートホストからの接続確認

$> psql --host=(PostgreSQLサーバのIP) --port=5432 --username=postgres --password

psqlのシェルが表示されたら成功。

<トラブル事例その1>
$> psql --host=(リモートのIP) --port=5432 --username=postgres --password

>> ユーザ postgres のパスワード:
>> psql: サーバに接続できませんでした: 接続を拒否されました
>>                               サーバはホスト"XXX.XXX.XXX.XXX"で稼動していますか?
>>                               また、ポート5432でTCP/IP接続を受け付けていますか?
  • PostgreSQLのポート(5432)のアクセス許可を確認:サーバ側
$> /etc/rc.d/init.d/iptables status

>> 6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:5432

許可してる

  • PostgreSQLのポート(5432)のアクセス許可を確認:クライアント側
$> telnet (XXX.XXX.XXX.XXX サーバのIP) 5432

>> Trying XXX.XXX.XXX.XXX...
>> telnet: connect to address XXX.XXX.XXX.XXX: Connection refused

クライアントからサーバにポート5432で接続が許可できていないことがわかる。
iptablesは前項で確認済みなのでPostgreSQLの設定をもう一度確認する。
※postgresql.confのlisten_addressesが'*'になってなかったりする。
※以下のように表示されれば外部からの接続が許可されていることを確認できる

$> telnet XXX.XXX.XXX.XXX 5432
>> Trying XXX.XXX.XXX.XXX...
>> Connected to XXX.XXX.XXX.XXX
>> Escape character is '^]'.
<トラブル事例その2>
$> psql --host=(リモートのIP) --port=5432 --username=postgres --password
>> ユーザ postgres のパスワード:※postgresのDBパスワードを入力
>> psql: FATAL:  password authentication failed for user "postgres"

パスワード認証で失敗。PostgreSQLにパスワードが設定されていないかパスワードが間違っているかどちらか。

phpPgAdminからのログイン確認

以上のことが漏れなく設定できていれば(サーバの再起動も含む)リモートからphpPgAdmin経由でログインできるはず。

大変わかりにくかったトラブル事例

SELinuxがEnforcingになっていた
$> vi /etc/sysconfig/selinux

>> SELINUX=disabled

$> reboot

CentOSだとOSのインストール時にSELinuxの設定項目があるのですが、ScientificLinuxでは無いためうっかり見過ごしがちです。
デフォルトでEnforcingになっているのに気がつかず(しかもそのことをすぐ忘れる)にずいぶん時間を浪費しました。

ip6tables

ip6tablesが有効になっていた&pg_hba.confでipv6の設定が抜けていたためにphpPgAdminのWebからのログインでアクセス拒否を食らってました。
以下の設定をpg_hba.confに追加するかip6tablesのサービスを停止するとよいでしょう。悪いことは言わない追加しとけ(削除しない)*1

$> vi /var/lib/pgsql/data/pg_hba.conf

>> host    all         all         ::1/128               md5

SELinuxとの合わせ技で原因究明に大変時間を浪費しました。今より全くLinuxスキルのなかった5年くらい前に触ったMySQL+phpMyAdminの組み合わせではなんの苦労もなかったんですが。
この時間泥棒め。


以上です。それでは、Good Luck !

*1:サービス停止しててもADODBライブラリがIPv6のアクセス権を見ているようで::1/128の項目がないとエラーに飛ばしてしまっている模様