□Apache2+PHP5+PostgreSQL(つまりLAPP)
□Apache2+PHP5+PostgreSQL
簡単に書くと、
0.必ず「su – root」でルートになること、環境変数を反映させるため
1.PostgreSQL を configure, make, make install
2.Apache2 を ./configure, make, make install
3.php を configure, make, make install
となる。Apache2 + PHP5 + PostgreSQL になってからすごい楽になりました。
その1:PostgreSQL のインストール
参考URL:
http://www.postgresql.jp/
/etc/passwd & /etc/shadow に postgres というユーザーを追加
/usr/sbin/adduser でも /usr/sbin/useradd でもいいけれど、
私は面倒なので mule(emacs) で直接書き加えています。
tar xvzf package/postgresql-8.4.0.tar.gz
cd postgresql-8.4.0/
./configure –with-perl –with-openssl –with-python –with-libxml –with-libxslt
make all
make install
他にもtclとかjavaとかで使うなら、それぞれオプションを追加して
ください。./configure –help でオプションを見ることが出来ます。
もっとも、そこまでするなら「シーラカンス本」は絶対に買ったほうがいい
と思いますよ。
でもって root 権限のままだと PostgreSQL がちゃんと動いてくれないので
関係するディレクトリを全て postgres オーナーに変更する
mkdir /usr/local/pgsql/data
chown -R postgres /usr/local/pgsql/
あとは
http://www.postgresql.jp/document/index.php3
の各バージョンのインストール方法をみて、サーバーの環境変数
(/etc/csh.login or /etc/profile)を下記のように編集すること。
bash の場合、/etc/profile の最後に下記を追加
> export POSTGRES_HOME=/usr/local/pgsql
> export PGLIB=$POSTGRES_HOME/lib
> export PGDATA=$POSTGRES_HOME/data
> export MANPATH=”$MANPATH”:$POSTGRES_HOME/man
> export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH”:”$PGLIB”
tcsh の場合、/etc/csh.login の最後に下記を追加
> # PostgreSQL
> setenv POSTGRES_HOME /usr/local/pgsql
> setenv PGLIB $POSTGRES_HOME/lib
> setenv PGDATA $POSTGRES_HOME/data
> if ($?MANPATH) then
> setenv MANPATH “$MANPATH”:$POSTGRES_HOME/man
> else
> setenv MANPATH $POSTGRES_HOME/man
> endif
> if ($?LD_LIBRARY_PATH) then
> setenv LD_LIBRARY_PATH “$LD_LIBRARY_PATH”:”$PGLIB”
> else
> setenv LD_LIBRARY_PATH $PGLIB
> endif
#みんなに使わせるなら、大元のこのファイルをいじったほうが良い
またそうするなら、~postgres/.cshrc は削除した方が良い
環境変数の設定ができたら、postgres で initdb して、データベースの
初期化を行い、起動しよう。(しないと次に進めない)
su – postgres
/usr/local/pgsql/bin/initdb
で、
> Success. You can now start the database server using:
>
> /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
> or
> /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
というようなメッセージが出ればOK。
あとは /etc/rc.d/rc.M を下記のように変更して起動させましょう。
> # Start PostgreSQL.
> #if [ -x /usr/pgsql/bin/pg_ctl ]; then
> # echo -n ” PostgreSQL”
> # /usr/pgsql/bin/pg_ctl -o “-i” start > /dev/null 2>&1
> #fi
> if [ -x /usr/local/pgsql/bin/pg_ctl ]; then
> echo -n ” PostgreSQL”
> rm /tmp/.s.PGSQL*
> rm /usr/local/pgsql/data/postmaster.pid
> su postgres -c “/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start”
> fi
PostgreSQL の最新版からは、起動時のオプションなどが
/usr/local/pgsql/data/postgresql.conf
に設定できるようになっているので、rc.local 等にべたべたに書かなくても
良くなった。必ず設定を一度見る(変更する)こと!
上記のコマンド(su postgres -c “/usr/…)をコマンドラインで実行しても
PostgreSQLが起動しない場合には、エラーメッセージを確認すること。
自分がはまったのは新しいバージョンから
> # These settings are initialized by initdb — they might be changed
> lc_messages = ‘ja_JP.eucJP’ # locale for system error message
> # strings
> lc_monetary = ‘ja_JP.eucJP’ # locale for monetary formatting
> lc_numeric = ‘ja_JP.eucJP’ # locale for number formatting
> lc_time = ‘ja_JP.eucJP’ # locale for time formatting
というパラメーターが増えたためだった。
「lc_time = ‘ja_JP.eucJP’」を「lc_time = ‘C’」にしてみた。
で、変更したら再起動。
再起動後に postmaster が動いているかどうかを ps で確認する。
補足:FATAL: could not create shared memory segment: と怒られた
これはPostgreSQLが共有メモリを取得出来なかったということです。
そんなときには必要な共有メモリ量を
cat xxxxxx > /proc/sys/kernel/shmmax
として放り込んであげましょう。
補足:max_fsm_pages というパラメータはしらないと怒られた
max_fsm_relationsは、フリースペースの設定が自動化されたのに伴い、
Ver8.4以降で削除されたので、postgresql.confから削除すること。
無事に動いたら、レギュレッションテストをする。
テストは postgres でおこなう。
レギュレッションテスト
cd /usr/src/
chown postgres -R ./postgresql-8.4.0/
su – postgres
cd /usr/src/postgresql-8.4.0/src/test/regress
make all runtest
> :
> :
> =======================
> All 114 tests passed.
> =======================
と、こんな感じでOKになれば大丈夫。
あとはPostgreSQL にアクセスするユーザーを createuser で追加すること。
それからは PostgreSQL 完全ユーザーガイド等を見ていろいろやってみよう。
注意しなければならない事(というか、はまったこと)は、データベース名を
Perl の方では大文字で宣言しても、実際にPgモジュールを通過する時には
小文字になる。例として、
Perlでの
> Pg::connectdb(“dbname=HOGEHOGE”)
はデータベース名「hogehoge」を見て、PHPでの
> pg_connect(“dbname=HOGEHOGE”);
は「HOGEHOGE」を見る。仕様なのか!?大文字小文字判断してよねぇ。
その2:Apache2 のインストール
参考URL:
http://www.apache.jp/
Apache2 になってかなり簡単になったけど、オプションに注意。
cd /usr/src/
tar xvzf package/httpd-2.2.11.tar.gz
mv httpd-2.2.11/ httpd-2.2.11-NORMAL/
cd httpd-2.2.11-NORMAL/
さて、そして ./config ですが、1.3.x から 2.x にするにはかなりの
変更があります。詳しくは manual/upgrading.html.ja.euc-jp に説明
が書いてあるので、該当オプションをどう書き換えればいいか、ちゃん
と把握すること。(少なくとも一度はきちんと読んだ方がいい!!)
make distclean
./configure \
–prefix=/usr/local/apache2-NORMAL \
–enable-info \
–enable-auth-dbm \
–enable-rewrite \
–enable-proxy \
–enable-so \
–enable-mods-shared=most \
–enable-suexec \
–with-suexec-caller=www \
–with-suexec-docroot=/usr/local/apache2-NORMAL/htdocs \
–with-suexec-logfile=/usr/local/apache2-NORMAL/logs/cgi.log \
–with-suexec-userdir=html \
–with-suexec-uidmin=100 \
–with-suexec-gidmin=100 \
–with-included-apr
make
make install
気がついた方、というよりもおかしい!?と思った方もいるかと思います
が、PHPのモジュールをどこで読み込むのかが分からないと思います。
Apache2 からはモジュールは自動読み込みなので、別に指定しなくても
いいみたいです。
また、aprというツールが古いと怒られるので「–with-included-apr」
というオプションは入れておいたほうが面倒でなくていいかも?
その3:PHP5 のインストール
参考URL:
http://www.php.net/
続いてPHP5のインストールをします。Apache1+PHP の時はスタティック
モードとかDS0モードとかありましたけど、Apache2+PHP5の場合には、
いわゆるDS0モードしかありません。
1.GD が要らない場合
cd /usr/src/
tar xvzf package/php-5.3.0.tar.gz
cd php-5.3.0/
./configure \
–with-pgsql \
–with-apxs2=/usr/local/apache2-NORMAL/bin/apxs \
–enable-ftp \
–enable-mbstring
make
make install
cp ./php.ini-dist /usr/local/lib/php.ini
となります。–enable-mbregex オプションが ./configure –help を
見てもなくなってしまったようなのですが、どうもデフォルトで ON の
ようですね。
で、インストールすると勝手に/usr/local/apache2/conf/httpd.confに
> LoadModule php5_module modules/libphp5.so
を追加してくれます。
2.GD が要る場合
GDで使用しているzlibとかのライブラリのありかを指定しないとダメです。
入れていないならMRTGの項目を参照して必要なライブラリを入れてから
進んでください。
> –with-gd[=DIR] Include GD support where DIR is GD install prefix.
> If DIR is not set, the bundled GD library will be used
> –with-jpeg-dir[=DIR] GD: Set the path to libjpeg install prefix
> –with-png-dir[=DIR] GD: Set the path to libpng install prefix
> –with-zlib-dir[=DIR] GD: Set the path to libz install prefix
> –with-xpm-dir[=DIR] GD: Set the path to libXpm install prefix
> –with-ttf[=DIR] GD: Include FreeType 1.x support
> –with-freetype-dir[=DIR] GD: Set the path to FreeType 2 install prefix
> –with-t1lib[=DIR] GD: Include T1lib support. T1lib version >= 5.0.0 required
> –enable-gd-native-ttf GD: Enable TrueType string function
> –enable-gd-jis-conv GD: Enable JIS-mapped Japanese font support
例:
cd /usr/src/
tar xvzf package/php-5.3.0.tar.gz
cd php-5.3.0/
./configure \
–with-pgsql \
–with-apxs2=/usr/local/apache2-NORMAL/bin/apxs \
–with-gd \
–with-iconv \
–with-jpeg-dir=/usr \
–with-png-dir=/usr \
–with-zlib-dir=/usr \
–with-xpm-dir=/usr \
–with-ttf=/usr \
–with-freetype-dir=/usr/X11R6 \
–enable-ftp \
–enable-gd-native-ttf \
–enable-gd-jis-conv \
–enable-mbstring
make
make install
cp ./php.ini-dist /usr/local/lib/php.ini
となります。
FreeType2 のライブラリファイルは Plamo-4.x の場合には2箇所にあります
が、/usr/XFree86/ の方ではNGでした。どちらも同じバージョンのはずなの
にサイズと生成日時が違うってキモチワルイなぁ…。
さて、あとは「httpd」をブート時に起動するようにします。
Plamoの場合には、/etc/rc.d/rc.httpd というファイルを作れば
いいのですが、この中身はこんな風にしてみました。
> #!/bin/sh
> #
> # KILL ALL
> /bin/killall httpd
> #
> echo -n “Apache: ”
> #
> # ROOT HTTPD
> #/usr/local/apache2-ROOT/bin/httpd -f /usr/local/apache2-ROOT/conf/httpd.conf
> #echo “ROOT ”
> #
> # NORMAL HTTPD
> /usr/local/apache2/bin/httpd -f /usr/local/apache2/conf/httpd.conf
> echo -n “NORMAL ”
> #
> # SSL HTTPD
> #/usr/local/apache2-SSL/bin/httpd -f /usr/local/apache2-SSL/conf/httpd.conf
> #echo “SSL ”
> #
> echo “Start.”
でいいです。おっと、作ったファイルを
chmod 755 /etc/rc.d/rc.httpd
するのを忘れずに。そうすると起動時に
> Apache: NORMAL Start.
というように表示されます。
あとは「.php」拡張子のファイルを有効にするために、
/usr/local/apache2-NORMAL/conf/httpd.conf に下記を追加する。
> #AddType
が書いてあるパートの最後に
> # And for PHP use:
> #
> AddType application/x-httpd-php .php .phtml
> AddType application/x-httpd-php-source .phps
を追加します。
全てが終ったら、リブート (^^; してもいいですし、手動で「httpd」
を再起動させてもOKです。
まずはサーバーに直接アクセスをしてみてください。
サーバーのIPアドレスが「192.168.0.100」ならば、
http://192.168.0.100/
として、まずはApache2の「It work!」が見れればOK。
さらに、下記のようなHTMLファイルをを置いてちゃんと表示できれ
ばOK! 例えば /usr/local/apache2/htdocs/test.php に、
工事中
printf("%s\n",mb_internal_encoding()); ?>
phpinfo(); ?>
とかして、PHPのパラーメーターが見れるページが出ればOKです。
その他の細かい設定は、Apache2 になってから 〜/conf/extra/ に
移動した。それぞれの設定ファイルの読み込みは 〜/conf/httpd.conf
の最後の方に書いてあるので、必要に応じてコメントアウトを解除して
設定ファイルを読み込むようにすること。
補足1:今までのPHPスクリプトがうまく動かない
とまぁ、ここまではうまく動くと思いますが、既存のPHPスクリプトが
うまく動かない場合には
> register_argc_argv = On
としてみましょう。というのも、PHPの新しいバージョンから、変数が
スクリプト全体で有効にはならなくなっています。(それぞれの関数内
だけで有効な、ローカル変数扱いになっている)
だけど、これは緊急回避の方法であって、全ての変数がグローバル参照
できるとなると、各種バグやおもいもしないセキュリティホールとなる
可能性があるので、上記のようにパラメーターを変更するように、など
といっているPHPスクリプトは使用しないようにしましょう。
本来であれば、さらに安全に動かすには
> safe_mode = On
とすること。この2つのパラメータを解除しろ、というようなPHPスクリ
プトは使用禁止ですね。
特にPHP4からPHP5にする場合には、
http://www.php.net/manual/ja/migration5.php
とかにも目を通しましょう。
補足2:日本語の処理がうまく出来ない
日本語は /usr/local/lib/php.ini の中の
> [mbstring]
> ; language for internal character representation.
> ;mbstring.language = Japanese
>
> ; internal/script encoding.
> ; Some encoding cannot work as internal encoding.
> ; (e.g. SJIS, BIG5, ISO-2022-*)
> ;mbstring.internal_encoding = EUC-JP
>
> ; http input encoding.
> ;mbstring.http_input = auto
>
> ; http output encoding. mb_output_handler must be
> ; registered as output buffer to function
> ;mbstring.http_output = SJIS
>
> ; enable automatic encoding translation according to
> ; mbstring.internal_encoding setting. Input chars are
> ; converted to internal encoding by setting this to On.
> ; Note: Do _not_ use automatic encoding translation for
> ; portable libs/applications.
> ;mbstring.encoding_translation = Off
>
> ; automatic encoding detection order.
> ; auto means
> ;mbstring.detect_order = auto
>
> ; substitute_character used when character cannot be converted
> ; one from another
> ;mbstring.substitute_character = none;
>
> ; overload(replace) single byte functions by mbstring functions.
> ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
> ; etc. Possible values are 0,1,2,4 or combination of them.
> ; For example, 7 for overload everything.
> ; 0: No overload
> ; 1: Overload mail() function
> ; 2: Overload str*() functions
> ; 4: Overload ereg*() functions
> ;mbstring.func_overload = 0
この辺を直せばOK。
詳しくは
http://www.php.net/manual/ja/ref.mbstring.php
を見よう。
補足3:??????.html という拡張子内でもPHPを動作させる
HTMLファイルが置いてあるディレクトリに「.htaccess」を置くのが簡単。
(もっとも、あらかじめ「.htaccess」が効くようにしておくこと)
> AddType text/html .html
> AddType application/x-httpd-php .html
補足4:ユーザーディレクトリでCGI(Perlとかね)をを動作させるには
Apache の場合、標準では「suexec」のチェックが厳しく、ユーザー個別の
ディレクトリでCGIを動作させるには、かなり厳しい状況に追い込まれると
思います。簡単なのは、「suexec.c」のソースを見て、自分で許す限りの
制限を撤廃してしまえばいいのですが、それと同時に httpd.conf の中で
次のことを忘れずに設定しましょう。
> # Options FollowSymLinks
> Options ExecCGI Indexes FollowSymLinks MultiViews
これ(ExecCGI)を忘れていると、CGIは動作させられないよ、と怒られます。
Apache1 までの、UserDir が suexec.h に反映されないというのは Apache2
では解決してます。
補足5:PHPのCGIバージョン
PHP5ではPHPのCGIバージョンは勝手に出来ます。
> # /usr/local/bin/php -v
> PHP 5.1.2 (cli) (built: Jan 24 2006 11:57:48)
> Copyright (c) 1997-2006 The PHP Group
> Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
ユーザー権限で動作させないと怖いよーん、とか、誰が動かしているのか
しりたいよーんという場合には、CGIバージョンにするのも手です。
補足6:libiconv_openとかが無いって怒られるんですけど?
もしこの先のインストール項目などでlibiconvを入れたあとにPHPの
インストールをしようとするとつまづきます。libiconvが定義している
libiconv_open=iconv_open などがPHPのconfigなどでは理解が出来ない
ため、そんな関数が無い!と怒られる。
でも実際には iconv.h で定義しているので Makefile の EXTRA_LIBS に
-liconv をつければ通ります。
> EXTRA_LIBS = -lcrypt -lc-client … -liconv
通るけどちゃんと動くかどうかって言うのは判りませんが。
補足6:Apache2にしたら、再起動でつまづくことが多くなった
Apacheの起動時に、
> [Mon Jan 23 16:15:58 2006] [notice] suEXEC mechanism enabled (wrapper: /usr/local/apache2/bin/suexec)
> [Mon Jan 23 16:15:58 2006] [notice] Digest: generating secret for digest authentication …
といって止まってしまう場合、/dev/random が悪さをしているらしい。
http://qootas.org/blog/archives/2006/01/colinux_devrand.html
というわけで、
mv /dev/random /dev/random.org
mknod /dev/random c 1 9
として、/dev/random を作り直せばOK。
これは再起動のたびにリセットされるので、Apache起動スクリプトの
中に書いてもいいと思う。