Linux Install Memo

サーバー管理者によるLinux関連ソフトのインストールメモ

Home » □Apache2+PHP5+PostgreSQL(つまりLAPP)

□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 に、




工事中




とかして、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起動スクリプトの
中に書いてもいいと思う。

Name of author

Name: admin

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です