Apache 2.2 HTTPサーバのインストール

(2003.10.19新規作成;
2004.6.12更新; 2006.5.5更新)

Fedora Core 5には、Apache HTTP Server 2.2.0 (Apache2)、GUIで設定できるsystem-config-httpdが含まれるが、suEXEC(後述)の設定が希望するものと違うので、自分でコンパイル・インストールした。

以下では、バーチャルホスト(virtual host; 仮想ホスト)とsuEXECを有効にしてインストールする。

次のようなURLとディレクトリの対応を想定する。

URL ディレクトリ
http://my.domain/~*/ /home/*/public_html/
http://subdomain.my.domain/ /home/foouser/anydir/

コンパイルからインストールまで

まずはファイルをダウンロードする。ファイルは次の場所にある。

Webサイト
Welcome! - The Apache HTTP Server Project

ネットワークへの負荷を考えて,日本国内のサーバーからダウンロードする。ファイル名はhttpd-x.y.z.tar.gz(x, y, zはバージョン番号)であり,一番新しいファイルをダウンロードする。

ファイルがダウンロードできたら,展開する。

$ bzip2 -dc httpd-2.0.52.tar.bz2 | tar xvf -
$ cd httpd-2.0.52

モジュールの選択

次に、Apacheに組み込むモジュールの設定を行う。モジュールの一覧は、モジュール一覧 - Apache HTTP サーバにある。

モジュールを選ぶとき、どういう方針でいくか。

  • "most"でほとんどのモジュールを有効にする。やや富豪的。モジュール単位で切る(無効にする)こともできるので、サーバが速いならこれが手軽。例えば、下記のようになる。(suEXECについては後述。)
    $ ./configure --enable-mods-shared=most --enable-suexec --with-suexec-caller=apache \
                  --with-suexec-docroot=/home --enable-ssl=static
    
  • 個別に最小限のものだけ指定する。サーバが非力のときはこちらがいい。私は、mod_rewrite, mod_so, mod_ssl, mod_suexec, mod_vhost_aliasあたりがあればいいので、それだけを指定する。
    $ ./configure --enable-rewrite --enable-so --enable-suexec \
        --enable-vhost-alias --with-suexec-caller=apache \
        --with-suexec-uidmin=500 --with-suexec-gidmin=500 \
        --with-suexec-docroot=/home --enable-ssl
    

Note.

vhost-alias の名前がApache 2.0から変わり、アンダースコアからハイフンになっている。

また、Apache 2.0では、--enable-ssl=static オプションを付ける。OpenSSLのコンパイル時の設定によっては実行時にX509_free()が見つからないエラーになることがあって、その回避のため。

どのモジュールが有効になっているかは、modules.c で確認できる。

suEXEC

(この節、2006.5.6更新)

suEXECは、各ユーザーのpublic_html/以下にあるCGIプログラムをそのユーザ権限で実行する。ホームディレクトリ以下にapacheユーザ (各ユーザから見るとother) の書き込み許可を与えなくてもよくなる。

CGIプログラムではない静的なHTMLファイルは、依然としてapacheユーザ権限でアクセスするので、public_htmlのパーミションは701でなければならない。

Note.

Note. Red Hat Linux / Fedora Coreは、ユーザープライベートグループ (User Private Group=UPG; ユーザごとにグループを生成する) を採っているので、groupのパーミションは重要ではない。

suEXECは、Apache 2.2のコンパイル時に設定する。

--enable-suexec
suEXECを有効にする
--with-suexec-caller=apache
Apache httpdのユーザ名を指定する。このユーザからしかsuEXECを起動できない
--with-suexec-uidmin=500
--with-suexec-gidmin=500
suEXECを有効にする最小のuid, gidを指定する。Fedora Core 5では、500からが一般ユーザなので、それを指定する。
--with-suexec-docroot
このディレクトリ以下と<各ユーザーのホームディレクトリ>/public_html 以下のほかはsuEXECでは実行できない(apacheユーザになる)。このオプションを省略すると /usr/local/apache2/htdocs となるが、「/home/ユーザ名」以下にディレクトリを作って、そこをバーチャルホストのルートにしたいので、指定する。

suEXECでカバーされないディレクトリは、apacheユーザでCGIプログラムが実行される。このようなCGIプログラムは、直接suexecコマンドを実行し、suexec-docroot以下のディレクトリにあるプログラムを別のユーザに成りすまして実行できる。mod_phpもapacheユーザで動くことに注意。潜在的なセキュリティ上の脆弱性が生じるので、suEXECを使うかどうか、suexec-docrootをどう設定するかも含めて十分な検討が必要。

次いで、コンパイル、インストールする。

$ make
$ su
# make install

以上で,/usr/local/apache2ディレクトリにインストールされる。

きちんとインストールされたか、設定を見ておく。suexecコマンドは、rootユーザが呼び出したときに限り、-Vオプションを付けると設定を表示する。

# ../bin/suexec -V
 -D AP_DOC_ROOT="/home"                   <----ここが/homeになっているか
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_EXEC="/usr/local/apache2/logs/suexec_log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

設定ファイルの変更

次に,設定ファイルを変更する。Apacheの設定ファイルのファイル名はhttpd.confで,/usr/local/apache2/confディレクトリにある。何ヶ所か変更を加えておく。

LoadModuleディレクティブで読み込まれているモジュールで不要なものをコメントアウトしておく。

#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so

Apache 2.2では、設定ファイルがいくつかに分かれている。httpd.confファイルのなかでIncludeしている。別ファイルになっている設定ファイルは、conf/extraディレクトリにある。例えば、mod_rubyについては、mod_rubyメモを参照。

httpdを実行するユーザー名,グループ名を変更する。デフォルトではnobodyだが,何でもかんでもnobodyで動かすと,nobodyユーザーが乗っ取られたときのリスクが大きくなる。

# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.

User apache
Group apache

サーバー管理者のメールアドレスを設定する。

# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
ServerAdmin root@ホスト名

次に、.htaccessで設定を変更できる範囲を拡大する。これはhttpd-userdir.confファイルに書く。

# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory /home/*/public_html>
    AllowOverride All
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
</Directory>

AddDefaultCharsetは明示的に文字コードの指定がないときに付加する文字コードを指定する。日本語の文書のときにもISO-8859-1を付けられては不味いので、設定を殺しておく。

# reasons in browsers, related to javascript and URL parsing
# which encourage you to always set a default char set.
#
#AddDefaultCharset ISO-8859-1

バーチャルホスト

バーチャルホスト (virtual host) を設定するときは、あらかじめDNSのほうも変更しなければならない。参照;djbdns(tinydns, dnscache) を使う

ここでは、orange.fruits、d.orange.fruitsが同じIPアドレスを指すようになっているものとする。

conf/extra/httpd-vhosts.confファイルで設定する。

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName orange.fruits
</VirtualHost>

<VirtualHost *:80>
  ServerName d.orange.fruits
  DocumentRoot /home/hori/public_diary
  UserDir disable
  SuexecUserGroup hori hori
</VirtualHost>

ホスト名ベース(ひとつのIPアドレス)のバーチャルホストにするので、NameVirtualHostを指定する。

SuexecUserGroupで指定したユーザー・グループでCGIプログラムは実行される。

Apacheの起動

httpd.confなどの設定ファイルを変更したら、httpdコマンドで確認しておく。誤りがある場合はエラーメッセージが出るので、適宜修正する。

# ../bin/httpd -t
Syntax OK

Apacheを起動するには、/usr/local/apache2/binにあるapachectlコマンドを使う。

# ./apachectl start

error_logファイルに起動メッセージが記録される。suEXECが有効になっていることを確認する。

chkconfigコマンドでシステムの起動時にapacheを起動するかどうか設定できるようにするために、apachectlスクリプトの最初のほうに次の行を追加しておく。

# chkconfig: - 85 15
# description: Apache HTTP Server.

また、/etc/rc.d/init.d/httpd(または/etc/init.d/httpd)へのシンボリックリンクを張っておく。

外部リンク

Apache 2 への移行
バーチャルホスト + suEXECの設定、コンテントネゴシエーションの設定など
Dynamically configured mass virtual hosting - Apache HTTP Server
大規模なバーチャルホストでは、外部マッピングファイルとmod_rewriteの組み合わせで設定できる。
ずん日記
SuexecUserGroupによる指定とUserDir内でのCGIプログラムの実行を両立するには