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 ※再起動
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 !