前回、Apache HTTP Serverをビルドしてみたところ、ライブラリが足りないために失敗しました。このようなときに打つ手を紹介します(編集部)
前回に引き続き、Apache HTTP Server(以下Apache)のビルドを実践形式で進めていきます。ドキュメントに従ってビルドを試みたところ、mod_deflateモジュールの依存関係で、configureスクリプトがエラーで停止するというところで前回は終了しました。mod_deflateモジュールを無効にすればコンパイルまで問題なく進むので、現状の問題はこの1点だけです。今回はこのmod_deflateモジュールの問題を解決していきます。
現実的に考えると、mod_deflateを使わないとはっきり確定しているなら、無効にしてそのままにしておく、というような判断もあるでしょう。ここでは解説のために問題を解決していく過程を解説するのですが、現実にビルドするときも、できるだけ問題を解決していくよう心がけたいと筆者は考えています。
問題解決の作業を通じてスキルアップもできるでしょうし、ドキュメントに載っていないような実際の状況も把握できます。ソフトウェアをソースコードからビルドすることを覚えるということは、ビルド対象のソフトウェアをよく知り、コントロールできるようになるということです。スキルを上げるためには、問題から逃げるよりも積極的に対処し、原因を究明するべきです。
さて、前回のconfigureスクリプトのコマンドは次のようなものでした。ビルドするApacheモジュールはできるだけ多くのモジュールを有効にしておきたいのでallを指定、MPM(Multi Processing Module)はPHPで推奨されているpreforkを選択しています。
./configure \ --prefix=/opt/apache-httpd-2.2.19 \ --enable-mods-shared=all \ --with-mpm=prefork \ 2>&1 | tee configure_log.txt
これを実行すると、次のようにエラーでconfigureが停止しました。mod_deflateに必要なzlibが見つからないというエラーです。
(略) checking whether to enable mod_ext_filter... shared (all) checking whether to enable mod_include... shared (all) checking whether to enable mod_filter... shared (all) checking whether to enable mod_substitute... shared (all) checking whether to enable mod_charset_lite... no checking whether to enable mod_deflate... checking dependencies checking for zlib location... not found checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
必要なソフトウェアはインストールドキュメントに書いてあるはずですが、zlibが必要という記述はありませんでした。Apacheのように機能がモジュール単位で分割されているソフトウェアでは、個々のモジュールのドキュメントに記載がある場合もあります。そちらも忘れずに確認しましょう。PHPも機能がモジュール化されていますが、ビルドに必要な情報は各モジュールの項目に記載されています。
しかし、mod_deflateについては、モジュールのドキュメントを参照してもはっきりとは書いてありません。ときにはこういうこともあります。そのようなときは、今回のようにエラーメッセージなどの状況から必要なものを把握します。
いずれにしても、必要になる外部ソフトウェアは、configureスクリプトが知っています。今回のケースでもzlibの存在をチェックしてエラー停止しています。外部ソフトウェアはconfigureのwith引数で指定できますので、ヘルプを参照すればどのような外部ソフトウェアに依存しているかを調べることができます。
zlibについては、ヘルプに次のような1行があります。--with-zで指定すれば良いことが分かります。
--with-z=DIR use a specific zlib library
このzlibの表示を見ても分かるとおり、外部ソフトウェアがあるということは分かるものの、必須のものなのか、オプションなのかまでは判然としないケースがほとんどです。ドキュメントからはっきり必要と分かっているものは組み込み、あとは実際のエラーに遭遇してから解決という流れで良いでしょう。
ソフトウェアが見つからなくてエラーになるのならと考え、ヘルプに表示される外部ソフトウェアを問答無用ですべて組み込む人もいるかもしれません。しかし、これは要らぬトラブルの元になりかねませんので止めた方がよいでしょう。互いに衝突するような引数もあります。
さて、ここで遭遇している問題を実際に解決するには、足りないzlibをインストールしなければならないことは明白です。zlibはデータ圧縮や展開の機能を持つライブラリです。mod_deflateはHTTPでデータ圧縮をするためのモジュールで、その圧縮部分は外部ソフトウェアを利用しているわけです。
インストール前に判断しなければならないのは、外部ソフトウェアをソースコードからビルドするのか、それともOSやディストリビューションに入っているパッケージを使うかということです。次のように決めると良いでしょう。
まず、OSやディストリビューションを探しても見つからない場合、当たり前ですがソースコードからビルドします。OSにあるものが、ビルドしたいソフトウェアが要求しているバージョンより古いものである場合も同様にビルドするしかありません。探して見つかれば、OSのパッケージを使っても問題はないということになります。
であれば、まずはパッケージの利用を考えます。こういったこまごまとした外部ソフトウェアをすべてビルドしていくのは、分量的に面倒です。また、外部ソフトウェアは多くの場合ライブラリで、とくに掘り下げて把握する必要はないということがほとんどです。ライブラリはコンパイルしてインストールで終わりなので、設定や運用といった作業がありません。パッケージを使うメリットの方が大きいと判断できます。
というわけで、パッケージをインストールしてzlibを使えるようにします。まずはパッケージを探し出さなければなりません。次のようにyum searchで分かっているキーワードを指定して実行します。
$ yum search zlib Loaded plugins: fastestmirror ================================ Matched: zlib ================================= perl-Archive-Tar.noarch : A module for Perl manipulation of .tar files iptstate.x86_64 : A top-like display of IP Tables state table entries jzlib.x86_64 : JZlib re-implementation of zlib in pure Java jzlib-demo.x86_64 : Examples for jzlib jzlib-javadoc.x86_64 : Javadoc for jzlib perl-Compress-Zlib.x86_64 : A module providing Perl interfaces to the zlib : compression library. perl-IO-Zlib.noarch : Perl IO:: style interface to Compress::Zlib zlib.i386 : The zlib compression and decompression library. zlib.x86_64 : The zlib compression and decompression library. zlib-devel.i386 : Header files and libraries for Zlib development. zlib-devel.x86_64 : Header files and libraries for Zlib development.
パッケージ名や説明文に“zlib”という言葉を含むものが出てきました。それぞれのパッケージ名のピリオドの後ろはプロセッサアーキテクチャで、パッケージ名と言うと、普通はピリオドの前を指します。そういうことを考え、説明文まで読んで探してみると、zlibというパッケージがあることが分かります。そしてもう1つ、zlib-develというパッケージがあります。こちらにはzlibのヘッダファイルという説明があります。
ヘッダファイルは第13回でも説明しましたが、ライブラリを組み込んでコンパイルする際に必要になるファイルです。CentOSなどではコンパイルに必要なファイルをまとめたパッケージには後ろに-develという名前が付くようになっています。ライブラリそのものはヘッダファイルがなくても動作するため、パッケージが分割された状態になっていることがほとんどです。
つまり、今回はzlibとzlib-develの2つのパッケージが必要ということになります。インストールは次のように実行します。
$ sudo yum install zlib zlib-devel
結果は以下のようになります。よく見ると、zlibはすでにインストールされていて、zlib-develのみが新たにインストールされたことが分かります。
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.nara.wide.ad.jp * extras: ftp.nara.wide.ad.jp * updates: ftp.nara.wide.ad.jp Setting up Install Process Package zlib-1.2.3-3.x86_64 already installed and latest version Package zlib-1.2.3-3.i386 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package zlib-devel.i386 0:1.2.3-3 set to be updated ---> Package zlib-devel.x86_64 0:1.2.3-3 set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: zlib-devel i386 1.2.3-3 base 101 k zlib-devel x86_64 1.2.3-3 base 102 k Transaction Summary ================================================================================ Install 2 Package(s) Upgrade 0 Package(s) Total download size: 202 k Is this ok [y/N]: y Downloading Packages: (1/2): zlib-devel-1.2.3-3.i386.rpm | 101 kB 00:00 (2/2): zlib-devel-1.2.3-3.x86_64.rpm | 102 kB 00:00 -------------------------------------------------------------------------------- Total 5.6 MB/s | 202 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : zlib-devel 1/2 Installing : zlib-devel 2/2 Installed: zlib-devel.i386 0:1.2.3-3 zlib-devel.x86_64 0:1.2.3-3 Complete!
この状態で、前述のconfigureのコマンドラインを実行するとconfigureはエラーなく終了するはずです。エラーで止まっていたあたりの出力は、次のようになっています。
checking whether to enable mod_deflate... checking dependencies checking for zlib location... /usr adding "-lz" to LIBS checking for zlib library... found forcing MOD_DEFLATE_LDADD to "-lz" removed "-lz" from LIBS checking whether to enable mod_deflate... shared (all)
zlibが自動的に検出されているのが分かります。この後ビルドすれば、問題なくビルドも終了します。
configureの実行時、「--with-z」引数は指定していませんが、それでも問題ありません。with引数は、外部ソフトウェアの組み込みそのものの指示と、外部ソフトウェアが存在するディレクトリの指示の2つの役割があります。欠かせないソフトウェアの場合、組み込みの指示の意味はなくなるので、後者だけの役割をもつ引数となりますが、/usrなどの標準的な位置であれば指定する必要がないのです。仮にzlibをビルドするなどして別の場所にインストールした場合には、「--with-z」指定により明示する必要があります。
次回は、allではインストールされないApacheモジュールのうち、一般的によく利用するものについて解説します。
Copyright © ITmedia, Inc. All Rights Reserved.