PostgreSQL
1.CGIとデータベース(RDB)
2.CGI+PostgreSQL
3.PostgreSQLのインストール
4.DBI/DBDのインストール
5.ユーザー/データベースの作成/テスト
6.CGIテスト
7.パスワード制限

1.CGIとデータベース

掲示板やサーチエンジン等、CGIプログラムは主にテキストデータの処理を目的としています。CGIプログラムを設計する際、これらのデータをどのように保存するかという点が大きな問題となります。
フリーウェアやシェアウェア等、一般配布を目的としたCGIプログラムの場合は汎用性や設置の手軽さを考えてフラットファイル(普通のテキストファイル)を採用している場合がほとんどです。
データの記録にフラットファイルを採用した場合、扱いが容易で汎用性に優れている反面

・ キャパシティー(データを保存できる容量)
・ データ保護(同時書き込みによるデータの破損)
・ 処理速度(データ量が多くなるに従い処理速度がどんどん遅くなる)

等の不利な点が数多くあります。特に2に関しては掲示板のログが頻繁に消えて困った経験されたかたも多いのではないでしょうか。
これら多くの問題はデータの保存先として「データベース」を利用することで解決できます。
「データベース」とはさまざまなデータを格納するためのソフトウェアで、一口にデータベースと言っても「カード型」「ツリー型」「リレーショナル型」等、さまざまなタイプがあります。
中でも昨今標準となった感のあるのが「リレーショナル型データベース(RDB)」で、オラクル、SQLserver、MS Access 等の市販RDB、PostgreSQL、MySQL 等フリーのRDBが存在しています。
このページで取り上げている PostgreSQL(ポストグレス あるいは ポストグレエスキューエルと呼ばれています) はフリーでありながら、非常に高性能であり数多くのサイトで実績のあるRDBです。

2.CGI+PostgreSQL

ここでは LinuxシステムへPostgreSQL7.1.3をインストールする方法を解説します。Linux以外でもUNIX系OSにインストールする場合はほぼ同じですので参照して下さい。
*HTTPサーバー及びPerlはすでにインストールされていることを前提としています。

a.ソースコードの入手
postgresql-7.1.3.tar.gz ソースコードをダウンロードします。

b.インストールの下準備
RedHat/Vine系などのシステムではすでにRPMパッケージのPostgreSQLがインストールされている場合があります。RPMパッケージのPostgreSQLがインストールされているとソースコードのコンパイルがうまくいかない場合があるのでこれを削除しておきます。

# rpm -aq | grep post

と入力して何か表示されたら PostgreSQLのパッケージが入っているので

# rpm -e 表示されているパッケージ名

として現在インストールされているパッケージを削除して下さい。

c.専用アカウント/ディレクトリの作成
PostgreSQLのインストールは 専用アカウントを作成して(慣例的に postgres )行います。

# useradd -d /usr/local/pgsql postgres
# chmod 711 /usr/local/pgsql

インストール作業は作成した postgresユーザーで行うため ソースコードを置くディレクトリを作成します。

# su - postgres // postgreユーザーになる
$ cd
$ mkdir src // srcディレクトリ作成

d.インストール
ソースファイル(postgresql-7.1.3.tar.gz)は先ほど作成した /usr/local/pgsql/src に置いてください。
インストールは 必ずpostgresユーザーで行います。(//以降はコメントです)

# su - postgres // postgreユーザーになる
$ cd /usr/local/pgsql/src
$ tar xfvz postgresql-7.1.3.tar.gz // ソースファイルが展開されます。
$ cd postgresql-7.1.3
$ ./configure --enable-multibyte=EUC_JP
$ make
$ make check // All 76 tests Passed. と表示されれば問題ありません。
$ make install // インストール完了。

e.環境設定
PostgreSQLを試用するために必要な環境を設定します。以下は bashを使用している例です。 ~postgres/.bashrc に以下の行を追加します。

PATH="$PATH":/usr/local/pgsql/bin
PG=/usr/local/pgsql
export PGLIB=$PG/lib
export PGDATA=$PG/data
export MANPATH="$MANPATH":$PG/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"

編集終了後

$ source ~postgres/.bashrc

を実行し変更を反映させます。

f.データベースクラスタの作成
データベースクラスタの作成は必ず postgresユーザーで行ってください。

$ initdb

を実行します。実行後環境変数 PGDATA で指定されたディレクトリをデータベースクラスタとしてセットアップします。

g.起動スクリプトの作成と起動
以下のコードをコピーして、起動スクリプト /etc/rc.d/init.d/postgres ファイルを作成します。

作成後 パーミッションの変更を行います。

# chmod 755 /etc/rc.d/init.d/postgres

PostgreSQLの起動と自動起動設定を行います。

# serivce postgres start
# chkconfig postgres on

以上で PostgreSQLのインストール/設定は完了です。

4.DBI/DBDのインストール

CGIからPostgreSQLを利用する場合、DBI/DBDモジュールのインストールが必要です。

a.ソースコードのダウンロード

【DBI】DBI-1.15.tar.gz
【DBD】DBD-Pg-0.95.tar.gz

b.DBIのインストール
インストールの順番は、必ずDBIを先に行います。DBDインストレーションのテストを行うときにDBIが必要となるためです。 DBI/DBDのインストールは PostgreSQLとは違い rootで行います。ソースコードを置くディレクトリは実際のパスに読み替えてください。

# cd /usr/local/src
 // 実際のパスに読み替えてください。
# tar xvzf DBI-1.15.tar.gz
# cd DBI-1.15
# perl Makefile.PL
# make
# make test
# make install

c.DBDのインストール
続いてDBDのインストールを行います。DBDのインストールにあたっては postgres を起動しておいてください。

# cd /usr/local/src
# tar xvzf DBD-Pg-0.95.tar.gz
# cd DBD-Pg-0.95
# export POSTGRES_LIB=/usr/local/pgsql/lib
# export POSTGRES_INCLUDE=/usr/local/pgsql/include
 // 上記exportを忘れるとMakefile.PLがエラー終了します。 # perl Makefile.PL
# make
# export PGUSER=postgres
# make test
# make install

以上で DBI/DBDのインストールは完了です。

5.ユーザー/データベースの作成/テスト

インストールが完了した時点では PostgreSQLを利用できるのはpostgresユーザーだけですが、PostgreSQLのスーパーユーザーであるpostgresユーザーでデータベースを利用するのはあまり好ましくありません。
そこでテスト用のユーザ及びデータベースを作成しそれを用いてテストを行うことにします。ここでは testuser という名前でユーザー、testdbという名前でデータベースを作成してみます。

$ cd /usr/local/pgsql/bin
$ createuser testuser
Shall the new user be allowed to create databases? (y/n)
Shall the new user be allowed to create more new users? (y/n)

この質問は作成するユーザーに「データベースを作成する権限を与えるか」「ユーザーを作成する権限を与えるか」というような意味で、それぞれ n と答えておいてください。

CREATE USER

と表示されればOKです。

続いてデータベースを作成します。

$ createdb testdb

CREATE DATABASE

と表示されればOKです。

それでは実際にデータベースに接続してテストを行ってみましょう。
例として次のような簡単なアドレス帳データを登録してみます。

nameemail
MOGmog@***.***.com
JONjon@***.***.net

シェル上(コマンドライン)からデータベースを操作するためには PostgreSQLに付属の psql を利用します。
$ psql [データベース名] とすることでデータベースに接続できます。

$ export PGUSER=testuser
 // 先ほど作成したtestuserになります。
$ psql testdb
 // testuserでtestdbデータベースに接続します。

testdb=>

上記のようなプロンプトが表示されればSQL文を記述してデータベースの操作を行います。

■テーブルの作成
上記のアドレス帳データを登録するため新たな表(テーブル)を作成します。 テーブルの名前は addrlist 、テーブル内の要素は name(名前)と email (メールアドレス)とします。

testdb=> CREATE TABLE addrlist (
testdb(> name TEXT,
testdb(> email TEXT
testdb(> );

SQL文は ;(セミコロン)までを1つの文と解釈されます。上記の例では4行に分けて記述していますが、1行で書いても同じです。
 // SQLについて説明しだすとそれだけで膨大な情報となってしまうので割愛させていただきます。スイマセン! 詳しくは解説書等を参照して下さい。

CREATE
と表示されればOKです。

テーブルの中身をのぞいてみましょう。

testdb=> SELECT * FROM addrlist;

とすれば

 name | email
------+-------
(0 rows)
と表示されるはずです。まだ中身は空の状態です。
それでは実際にデータを登録してみましょう。

INSERT INTO addrlist VALUES ('MOG','mog@***.***.com');

INSERT INTO とはテーブルに新たにデータを挿入するSQL文です。
それでは、再度テーブルの中身を見てみます。
testdb=> SELECT * FROM addrlist;

 name |      email
------+-----------------
 MOG  | mog@***.***.com
(1 row)
テーブル内にデータが登録されているのがわかりますね。
続けてデータを登録してみましょう。

INSERT INTO addrlist VALUES ('JON','jon@***.***.net');

中身を見ると

testdb=> select * from addrlist;

 name |      email
------+-----------------
 MOG  | mog@***.***.com
 JON  | jon@***.***.net
(2 rows)
登録されていますね。
psqlを終了するには

testdb=> \q

と入力します。

6.CGIテスト

PostgreSQL、DBI/DBDのインストールも終わり、テストデータベースの用意もできました。今度はCGIを使ってテストデータベースに接続してみます。

1.上記ソースコードをコピー&ペースとして適当なファイル名(dbtest.cgi等)を付けて保存してください。
2.保存したファイルをサーバーにアップロードしてパーミッションを<755>に変更してください。
3.ブラウザでアップロードしたファイルにアクセスして下さい。画面が表示されれば成功です。

■エラーとなる場合
CGIがエラーとなる場合はPerlパスやパーミッションの設定ミス以外にPostgreSQLのライブラリパスがシステムに通っていない事が考えられます。
その場合は、/etc/ld.so.conf ファイルに

/usr/local/pgsql/lib

行を追加した後

/sbin/ldconfig -v

コマンドを実行してください。
*この作業はrootで行います。

7.パスワード制限

先のテスト例ではデータベースにパスワードが設定されていませんでしたが、実際に運営する際にはパスワードの設定が望まれます。データベース testdb にパスワードを設定するには次のように行います。

a.testdbとの接続
postgresユーザーでtestdbに接続します。

$ psql testdb

ユーザー testuser の接続に対してパスワードを設定します。

testdb=> ALTER USER testuser WITH PASSWORD 'mypassword';

パスワード mypassword は独自のパスワードに変更してください。

b.pg_hba.confの編集
データベースに設定したパスワードを有効にするためには pg_hba.confの編集が必要です。
/usr/local/pgsql/data/pg_hba.conf を次のように編集します。

# This default configuration allows any local user to connect as any
# PostgreSQL username, over either UNIX domain sockets or IP:

local testdb                                     crypt
host  testdb    127.0.0.1  255.255.255.255       crypt
local all                                        trust
host  all       127.0.0.1  255.255.255.255       trust   

c.パスワードテスト
パスワードが有効になっているか確認します。

$ export PGUSER=testuser
$ psql testdb

Password:

とパスワード入力プロンプトが表示されればOKです。先ほど設定したパスワードを入力し、ログインしてください。

d.CGIからのパスワードテスト
先ほどテストしたCGIにブラウザで再度アクセスしてみて下さい。先ほどは正常に表示されたとしても今度はエラー表示になってますよね?(キャッシュが表示されているかもしれないので再読込して下さい)これは、データベースにパスワードを設定したにもかかわらずCGI中ではパスワードを指定していないので当然です。
そこで、CGI中でもパスワードを指定して再度試してみましょう。

$DB_pwd = '';

CGIソース中のこの箇所にパスワードを記述します。

例:
$DB_pwd = 'mypassword';

編集したCGIソースファイルをサーバーにアップロードしブラウザで再びアクセスしてください。今度は正常に表示されましたか? 表示されれば完了です。

| ページ先頭に戻る |

制作:北崎 剛宏