Redhat9のphpをアップデートするためにApache(httpd)もアップデートする羽目に | 鯖管Changelog。--アメブロ支店

鯖管Changelog。--アメブロ支店

主に地方のサーバ管理者の日常と管理記録、トラブルサポート事例、趣味のPC自作に関する情報、ほか雑談などを、気の向いたときに好きなように、勝手気ままに書きなぐるブログです。

主に会社のRedhatLinux9やRHEL/CentOS、その他Solarisなど管理しています。

RedHat Linux 9 > Apache 2.0.61 > rpm > rebuild > from source > httpd-2.0.61.tar.gz
> apr / apr-devel > rpm > rebuild >
> php 4.4.7 > configure > make


このBlogエントリでは、Redhat9用 Apache 2.0.61のRPMおよびSRPMを作成してインストールする経過を書いています。またi386.rpmおよび src.rpmを公開しています。php 4.4.7については rpm化を断念してconfigure makeしています。→後日RPM化 に成功しました。

元々はこのPHPスクリプトを動かしたかったのです。

PCサイト->携帯変換スクリプト(pc2m)

このスクリプトが、PHPのバージョン4.3.0以上を要求するのですが、手元のサーバのPHPは4.2.2。
それではということで、PHP 4.x系でSRPMで転がっているものはないかと探してみると
php-4.3.3-4.1.src.rpm というのがありました。本当はPHP 4系はディスコンになることが決まっているのでPHP5にしたいところですが、メジャーバージョンまで一気に変わるのは不安すぎるのと、src.rpmが存在するという安心感から、4.3.3を選択。

rpm -ivh php-4.3.3-4.1.src.rpm して、ソース/SPECファイル類を展開し、php.specファイルを確認してみると、ちゃんと2バイト文字を処理するための
--enable-mbstring
--enable-mbstr-enc-trans
--enable-mbregex
も設定済みで安心。早速 rpmbuild --rebuild php-4.3.3-4.1.src.rpm すると、apacheのバージョンが2.0.44以上でなきゃダメというメッセージでRPMパッケージのビルドが止まってしまいます。そこでついに重い腰を上げてhttpd (apache)のバージョンを上げてみることにしました。

なるべくなら、tarballからの野良ビルドは避けたいので、適当なRPMパッケージはないかと検索すると、
Apache2.2.6をパッケージ化してインストール という記事を発見。
早速参考にしていただきます。2.0.41からいきなり2.2.6というのはあまりに危険なので、2.0.61を使ってみます。

apache 2.2.6 2.0.61 のtarballを入手して、/usr/local/src以下に展開

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/httpd/httpd-2.0.61.tar.gz
# tar zxf httpd-2.0.61.tar.gz

ここで、このアーカイブ中に含まれている aprおよびapr-utilsをそれぞれRPMパッケージ化してインストール。

aprのパッケージ化

# cd httpd-2.0.61/srclib
# cp apr/build/rpm/apr.spec.in apr/build/rpm/apr.spec
# vi apr/build/rpm/apr.spec

Version: 0.97 ←書き換え (apache 2.2.xでは1.2.10以上のようです)
Release: 1 ←書き換え

%configure \
--prefix=/usr \
・・・・
--disable-ipv6 \ ← configure末尾にオプション追加

# cp -ipr apr apr-0.97
# tar zcf apr-0.97.tar.gz apr-0.97
# rpmbuild -ta apr-0.97.tar.gz

※このとき、doxygenがインストールされていないと、エラーでビルドできません。
# yum install doxygen してインストールしましょう。

aprとapr-develのインストール

# cd /usr/src/redhat/RPMS/i386/; rpm -ivh apr-0.97-1.i386.rpm apr-devel-0.97-1.i386.rpm; cd -

apr-utilのRPM化 (上記のapr,apr-develをインストールしておかないとビルド不可)

# cp apr-util/build/rpm/apr-util.spec.in apr-util/build/rpm/apr-util.spec
# vi apr-util/build/rpm/apr-util.spec

Version: 0.97
Release: 1

# cp -ipr apr-util apr-util-0.97
# tar zcf apr-util-0.97.tar.gz apr-util-0.97
# rpmbuild -ta apr-util-0.97.tar.gz

apr-util apr-util-develのインストール

# cd /usr/src/redhat/RPMS/i386/; rpm -ivh apr-util-0.97-1.i386.rpm apr-util-devel-0.97-1.i386.rpm; cd -

これでやっとhttpd-2.0.61のビルドに入れます。

# cd /usr/local/src
# rpmbuild -ta httpd-2.0.61.tar.gz

そして、インストール。

[root@web i386]# rpm -Uvh httpd-2.0.61-1.i386.rpm httpd-manual-2.0.61-1.i386.rpm httpd-devel-2.0.61-1.i386.rpm mod_ssl-2.0.61-1.i386.rpm
エラー: Failed dependencies:
/usr/local/bin/perl is needed by httpd-devel-2.0.61-1
httpd-mmn = 20020628 is needed by (installed) mod_perl-1.99_07-5
httpd-mmn = 20020628 is needed by (installed) mod_python-3.0.1-4
httpd-mmn = 20020628 is needed by (installed) php-4.2.2-17.17.legacy
libapr.so.0 is needed by (installed) mod_perl-1.99_07-5
libaprutil.so.0 is needed by (installed) mod_perl-1.99_07-5

あれ?
どうも元から入っているhttpd-2.0.40-21.21-legacyに含まれるライブラリに依存するパッケージが存在する模様です。mod_perlとmod_pythonをアンインストール。さらに php-4.22-17.17.legacyと、php-pgsqlなどphp-4.22に依存するパッケージをすべてアンインストールします。

これでも、httpd-devel-2.0.61-1について/usr/local/bin/perlが足りないよと言われます。/usr/local/bin/perlは/usr/local/bin/perl5.8.0からのシンボリックリンクとしては存在しています。
まずは、httpd-devel以外をインストールし、etc/init.d/httpd restartして正常動作を確認します。

次にhttpd-develですが、rpm -ivh --forceでもだめなので、やむを得ずrpm -ivh --nodepsでインストール。httpd-develがインストールできないと、phpが使用する/usr/sbin/apxsがインストールされません

なお、apacheを2.0から2.2にアップデートする際には、設定ファイル周りにもいろいろ変更がある模様。よく調べてからインストールしないと泣く事になりそうです。このあたり で少しお勉強してからにします。

Apacheのバージョンアップができたらようやくphpのrpmパッケージをリビルドできるようになります。

リビルドしたパッケージを以下に置いておきます。
(自己責任でご利用ください)
SRPM : httpd-2.0.61-1.src.rpm
RPM: http://www.nasu-net.or.jp/~hiromiti/RPMS/i386
httpd本体とhttpd-devel,apr,apr-devel,apr-util

さて、やっとphpのRPMパッケージのリビルドなんですが、どうしてもRPMファイル生成の最終段階でこけてしまいます。

そこでやむを得ず、本家(http://www.php.net/)からphp-4.4.7のソースコードを持ってきて素直に展開し、configure make make installしてしまうことにしました。

# wget http://jp.php.net/get/php-4.4.7.tar.gz/from/jp2.php.net/mirror

# ./configure --with-apxs2=/usr/sbin/apxs \
--enable-mbstring \
--enable-mbregex \
--with-mysql \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-png-dir=/usr/lib \
--with-zlib-dir=/usr/lib \
--with-openssl \
--enable-calender \
--enable-dba \
--enable-exif \
--enable-ftp

# make
# make install

このあと、httpd.confに以下の行があることを確認します。

AddType application/x-httpd-php .php .php4
LoadModule php4_module /usr/lib/httpd/modules/libphp4.so

LoadModuleの行はインストーラが勝手に付けてくれることになっていますが、httpdがpreforkで動いているのに、

<IfModule worker.c>
LoadModule cgid_module modules/mod_cgid.so
LoadModule php4_module /usr/lib/httpd/modules/libphp4.so
</IfModule>
こんなところに入れてくれたりするので注意が必要です。私の場合はpreforkなので、<IfModule prefork.c>と次の</IfModule>の間にコピーしてやりました。

変更が完了したら、httpdを再起動します。
/etc/init.d/httpd restart

そして、pc2mに付属のチェックスクリプトをブラウザから呼び出します。
http://webserver/_check.php
「必要な環境は整っているようです」「画像変換テストは正常に終了したようです」と表示されれば成功です。

上記のテストが完了すると、3キャリアの携帯電話向けにページを変換して表示してくれるようになります。たとえばYahoo!Japanだと、こんな感じ

ちなみにこのphpスクリプトがどうやって携帯キャリアの識別をしているかというと、アクセス元のIPアドレスから判別していました。i-modeが2つのネットワークアドレスだけでまとまっているのに対して、auはネットマスク長もIPレンジもバラバラで、なかなか興味深いです。

http://www.nttdocomo.co.jp/service/imode/make/content/ip/
http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
http://developers.softbankmobile.co.jp/dp/tech_svc/web/ip.php
http://www.willcom-inc.com/ja/service/contents_service/club_air_edge/for_phone/ip/

CoRichブログランキング