Apache + PHP + PostgreSQL で認証ページを作る


久々にプログラムを作ることになって、mod_auth_pgsql という、apache の BASIC 認証を PostgreSQL のデータベースを使ってやるモジュールを題材に料理してみることにしました。

謝辞

このコーナーは以下の資料を参考にいたしました。
  • 「PHPxPostreSQLで作る最強Webシステム」石井達夫氏著・技術評論社・2003年
  • 「PHP実践のツボ」山本勇氏著・九天社・2002年
  • 「Apache アプリケーションサイト構築」安田幸弘氏著・オーム社・2001年
  • Stack Asterisk 連載記事・IT Boost 社
  • Hiz Laboratory



(1) コンパイルと環境設定

先に Apache + PHP + PostgreSQL の環境を作成しておきます。

今回は Apache 1.3.33, PHP 4.3.10, PostgreSQL 7.4.6 を使用しました。

説明の便宜上、root のプロンプトは #、普段自分で使うユーザが %、pgsql ユーザが $ にしていますが、特にそれぞれが sh/csh 系のシェルでないといけないということではありません。あくまで便宜上ですので。


さて、各アーカイブを /usr/local/src にでも展開します。


% cd /usr/local/src/apache_1.3.33
% env OPTIM="-O2" ./configure --enable-module=so
% gmake
% su root -c "gmake install"
%
% cd ../php-4.3.10
% ./configure --without-mysql --with-apxs=/usr/local/apache/bin/apxs --enable-mb
str-enc-trans --enable-mbstring --enable-trans-sid
% gmake
% su root -c "gmake install"

ここで、一度 httpd を起動して確認したいのですが、httpd.conf を触らないとエラーで怒られます。


#LoadModule env_module         libexec/mod_env.so
#LoadModule config_log_module  libexec/mod_log_config.so
#LoadModule mime_module        libexec/mod_mime.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module      libexec/mod_status.so
#LoadModule includes_module    libexec/mod_include.so
#LoadModule autoindex_module   libexec/mod_autoindex.so
#LoadModule dir_module         libexec/mod_dir.so
#LoadModule cgi_module         libexec/mod_cgi.so
#LoadModule asis_module        libexec/mod_asis.so
#LoadModule imap_module        libexec/mod_imap.so
#LoadModule action_module      libexec/mod_actions.so
#LoadModule userdir_module     libexec/mod_userdir.so
#LoadModule alias_module       libexec/mod_alias.so
#LoadModule access_module      libexec/mod_access.so
#LoadModule auth_module        libexec/mod_auth.so
#LoadModule setenvif_module    libexec/mod_setenvif.so
LoadModule php4_module        libexec/libphp4.so
                                                                                

LoadModule の行は PHP4 を残してそれ以外はすべてコメントアウトしておきます。AddModule の行はそのままにしておきます。こうしないと、DSO 構成なので二重にモジュールをロードしようとしてしまうみたいです。(もう少しスマートな回避方法をご存知の方はご教示ください)


# /usr/local/apacahe/bin/apachectl start

でうまく起動できればここまでは問題ありません。あとは必要に応じて php.ini などを作成します。

つづいて PostgreSQL のコンパイルですが、実行用ユーザ(ここでは pgsql)を先に作成して、ログインディレクトリやパスワードなどを作っておきます。ソースツリーの所有者も pgsql へ変更しておいてください。


% su 
# mkdir /usr/local/pgsql
# chown pgsql:pgsql /usr/local/pgsql
# chown -R pgsql:pgsql /usr/local/src/postgresql-7.4.6
# su - pgsql
$ cd /usr/local/src/postgresql-7.4.6
$ ./configure --enable-multibyte=EUC_JP --enable-syslog
$ gmake
$ gmake install
$ initdb
$ /usr/local/pgsql/bin/pg_ctl start
                                                                                

こんな感じでテスト起動できればOKです。あとは、/usr/local/pgsql/data/postmaster.opts や postgresql.conf、pg_hba.conf などを煮詰めていくことになります。

いよいよ、mod_auth_pgsql を用意します。tar を /usr/local/src に展開しておきます。私は DSO でインストールしてみました。


% cd /usr/local/src/mod_auth_pgsql-0.9.12
% more INSTALL
% ./configure --with-apxs=/usr/local/apache/bin/apxs --with-pgsql=/usr/local/pgs
ql
                                                                                

ここで、make する前に INSTALL のドキュメントの指示に従って、apxs の内容を書き換えます。apxs は perl スクリプトなので、念の為に前のをコピーしておくか、変更箇所のオリジナルをコメントにしておきます。


#my $CFG_LD_SHLIB      = q(gcc);          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = q(ld);          # substituted via Makefile.tmpl
#my $CFG_LDFLAGS_SHLIB = q(-shared); # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-G); # substituted via Makefile.tmpl
                                                                                

これで apxs を使ってコンパイルします。


% /usr/local/apache/bin/apxs -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -
lpq -o mod_auth_pgsql.so -c mod_auth_pgsql.c auth_pgsql_shared_stub.c
% /usr/local/apache/bin/apxs -i -a -n auth_pgsql mod_auth_pgsql.so
                                                                                

これで httpd を再起動するのですが、mod_auth_pgsql.so は 起動時に libpq.so を探しにいきます。ところが、libpq は /usr/local/lib などではなく /usr/local/pgsql/lib にあるので、LD_LIBRARY_PATH 環境変数でこのディレクトリを指定しておく必要があります。いくつか方法がありますが、/usr/local/apache/bin/apachectl はシェルスクリプトなので、どこかで export LD_LIBRARY_PATH=/usr/local/pgsql/lib などとすればよいでしょう。

また、httpd.conf も確認しておきましょう。




# more /usr/local/apache/conf/httpd.conf
(途中略)
LoadModule php4_module        libexec/libphp4.so
LoadModule auth_pgsql_module  libexec/mod_auth_pgsql.so
(途中略)
AddModule mod_php4.c
AddModule mod_auth_pgsql.c
(以下省略)
                                                                                

このような行が自動的に追加されているはずです。では起動してみましょう。/usr/local/apache/logs/error.log を確認します。


[notice] Apache/1.3.33 (Unix) mod_auth_pgsql/0.9.12 PHP/4.3.10 configured -- res
uming normal operations
                                                                                
ということで、一応動いているようで。


最後になりましたが(別に最後でなくてもいいんだけど) PHP の PostgreSQL モジュールをコンパイルします。これが FreeBSD では結構たいへんです。GNU libtool と GNU m4 と autoconf と automake が必要です(手元にあった RedHat Linux 9.0 ではそこそこ標準インストールだと自動的に入っているみたいです)。先にインストールしておきましょう。Ports/Packages を使ってもいいですし、コンパイルはソースからやっても configure して gmake して gmake install するだけですのでここでは省略します。


% cd /usr/local/src/php-4.3.10/ext/pgsql
% phpize
% ./configure
% gmake
% su root -c "gmake EXTENSION_DIR=/usr/local/lib/php/extensions install"
                                                                                

ここまでできれば、php.ini の設定を追加します。diff はこんな感じ。


--- php.ini.orig        Tue Dec 21 17:48:39 2004
+++ php.ini     Tue Dec 21 17:52:19 2004
@@ -441,7 +441,8 @@
 user_dir =

 ; Directory in which the loadable extensions (modules) reside.
-extension_dir = "./"
+extension_dir = /usr/local/lib/php/extensions
+extension=pgsql.so

 ; Whether or not to enable the dl() function.  The dl() function does NOT work
 ; properly in multithreaded servers, such as IIS or Zeus, and is automatically
                                                                                

これで apache を再起動します。

次へ

メニューへ戻る