Debianに移行したサーバで、PHP経由でPostgreSQLのDBへアクセスできない、という件の調査対応。
まとめると、
- php.confにPostgreSQLのモジュールpgsqlを読み込む設定
- PostgreSQLにwww-dataユーザを作成
- identを動かす
- ローカルからの接続は許可する
が必要でした。
php.confにPostgreSQLのモジュールpgsqlを読み込む設定
これをしていないと、
Fatal error: Call to undefined function: pg_connect() in 〜
というようなエラーが出てきて動きません。
原因は /etc/php4/apache/php.ini に pgsql.so のモジュールを読み込む設定がされていないためでした。
本来は、apt でインストールした際に php.conf に書かれているはずなのですが。
それ以前に php-pgsql が入っていない場合は当然ながら動きませんので、apt-get install php-pgsql しておきましょう。
/etc/php4/apache/php.ini に下記行を追加
extension=pgsql.so
その後apacheの再起動
(参考)
PostgreSQLにwww-dataユーザを作成
Debianではapacheが標準で「www-data」というユーザで動いています。
以前のサーバでは「httpd」というユーザで動かしていたため、PostgreSQLに登録されているユーザと相違が生まれてしまっていました。
そのため「www-data」ユーザを作成して権限等もこのユーザに対して行うように変更。
# createuser www-data
=> grant all on 〜 to "www-data";
(参考)
identを動かす
それでも下記のようなエラーが出ました。
IDENT authentication failed for user 'www-data'
IDENTで認証がうまくいかないということで、それまではidentdを動かしていなかったので、inetd.confを修正してidentdを動かすように設定。
むろん、identd自体が入っていなければ出来ないので、入っていなかったら apt-get install pidentd しておきます。
/etc/inetd.conf を修正(該当行の頭の「#」を取るだけ)
ident stream tcp wait identd /usr/sbin/identd identd
(参考)
ローカルからの接続は許可する
それでも、www-data以外のユーザで接続しようとすると、ユーザ名とパスワードを指定してもうまく通らなかった。
IDENT authentication failed
とエラーが出てしまう。
それで検索してみると、デフォルトではローカルからの接続も信用されないため、全てIDENTが呼ばれるようになっているのでうまくいかないようだった。
そこで、postgresの設定を修正した。
/etc/postgresql/pg_hba.conf を修正(該当行の頭の「#」を取るだけ)
local all all trust host all all 127.0.0.1 255.255.255.255 trust
その後、postgresqlを再起動。
(参考)