中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

Linux/Apache事始め-ビルド編-

まずは開発環境を構築しなければなりません。
方法は2通りあります。

  1. パッケージ管理ソフトでインストール
  2. アパッチをビルド

1.では芸が無い環境によってアパッチのバージョンや構成が
まちまちになってしまうので私的には2.を推奨します。

また(開発ではなくて)本番サービスで使うアパッチも自前でビルドした方が良いでしょう。*1

アパッチビルド手順

$ cd /tmp
$ wget http://ftp.kddilabs.jp/infosystems/apache/httpd/httpd-2.0.63.tar.gz
$ tar xzvf ./httpd-2.0.63.tar.gz
$ cd ./httpd-2.0.63
$ ./configure \
--prefix=/usr/local/apache2 \
--with-mpm=worker \
--enable-modules=most \
--with-ssl=/usr/local/openssl --enable-ssl=shared \
--enable-cache=shared --enable-disk-cache=shared --enable-mem-cache=shared \
--enable-proxy=shared \
--enable-proxy-connect=shared --enable-proxy-ftp=shared --enable-proxy-http=shared
$ make
$ sudo make install

オプション解説

configure共通

--prefix=/usr/local/apache2
インストール先のディレクトリを指定します。

MPM

--with-mpm=worker
アパッチのプロセスモデル*2を指定します。
以下の2つを簡単な特徴と一緒に覚えておけば良いでしょう。

prefork
リクエストをシングルスレッドで処理する。
worker
リクエストをマルチスレッドで処理する。

どちらもアパッチは複数の子プロセスを立てます。
一つの子プロセスの中で更にマルチスレッド処理を行う方がworkerです。
勿論workerの方が効率的なのですが同時にマルチスレッド問題を抱えます。*3
またサードパーティモジュールでは対応していない物も多い。

拡張プログラムを指定

アパッチの拡張プログラムの事をアパッチモジュール、または単にモジュールモド(mod)と呼びます。
ビルドの際に指定する以下のオプションがあります。
一括指定

--enable-modules={ most | all }
モジュールを本体(httpd)に組み込む(静的リンク)
--enable-shared-modules={ most | all }
モジュールをビルド(後から動的リンク)

個別指定

--enable-???={ yes | static | shared }
???で指定したモジュールをビルド

yesの解釈

--enable-modulesを指定した場合
staticとして解釈
--enable-shared-modules
sharedとして解釈
どちらも指定せず
staticとして解釈
個別に追加したモジュール
mod_ssl
HTTPSを使う場合は必須
mod_cache
キャッシュサーバ機能(Squidの様なもの)
mod_proxy
プロキシサーバ機能

*1:アパッチもプログラムですから稀にいや、かなりの頻度でバグが見つかります。
バグがセキュリティーホールに直結する場合は早急に対応しなければなりませんが
1.で運用していると新たなパッケージがリリースされるまで対応できません。
本業でWebサービスを行っている場合、それは致命的な損害を受けるリスクを放置すると言う事です。
当然、容認できませんから結局は自前でビルドせざるをえません。
それならば始めから2.としてノウハウを貯めておいた方が良いでしょう。

*2:プロセス/スレッドの構成

*3:複数のスレッドからの同時アクセスを制御する必要がある為、プログラムが複雑になり開発の難易度が上がる